Получение всех методов/сообщения обращается к объекту

В файле, в котором Вы используете только Указатель или Ссылку на класс. И никакой участник/функция членства не должен быть вызван мысль они Указатель / ссылка.

с class Foo;//предописание

Мы можем объявить элементы данных типа Foo* или Foo&.

Мы можем объявить (но не определить), функции с аргументами и/или возвращаемые значения, типа Foo.

Мы можем объявить статические элементы данных типа Foo. Это вызвано тем, что статические элементы данных определяются вне определения класса.

6
задан Jacob 25 August 2009 в 12:20
поделиться

3 ответа

Вы также можете использовать пересылку target-c . По сути, вы можете создать прокси-объект, который регистрирует методы, а затем перенаправляет вызов оригиналу. Более подробную информацию см. В моем сообщении в блоге .

@interface LoggerProxy : NSObject
{
    id original;
}

- (id)initWithOriginal:(id) value;

@end
@implementation LoggerProxy

- (id) initWithOriginal:(id)value
{
    if (self = [super init]) {
        original = value;
    }
    return self;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    NSMethodSignature *sig = [super methodSignatureForSelector:sel];
    if(!sig)
    {
        sig = [original methodSignatureForSelector:sel];
    }
    return sig;
}

- (void)forwardInvocation:(NSInvocation *)inv
{
    NSLog(@"[%@ %@] %@ %@", original, inv,[inv methodSignature],
         NSStringFromSelector([inv selector]));
    [inv invokeWithTarget:original];
}

@end
18
ответ дан 8 December 2019 в 03:54
поделиться

Лучший способ сделать это - использовать dtrace или скрипт инструментов. Используя dtrace, вы можете сделать следующее:

Напишите следующий скрипт как objc-calls.d

#pragma D option quiet
objc$target:::entry
{
   printf("%s %s\n", probemod, probefunc);
}

Затем запустите приложение с помощью скрипта:

setenv DYLD_SHARED_REGION avoid
sudo dtrace -s objc-calls.d -c /Path/To/Your/App/Binary

Вы также можете создать собственный инструмент, используя аналогичный зонд dtrace.

8
ответ дан 8 December 2019 в 03:54
поделиться

Вы можете использовать объект NSProxy и переопределить метод forwardInvocation: .

0
ответ дан 8 December 2019 в 03:54
поделиться