В файле, в котором Вы используете только Указатель или Ссылку на класс. И никакой участник/функция членства не должен быть вызван мысль они Указатель / ссылка.
с class Foo;
//предописание
Мы можем объявить элементы данных типа Foo* или Foo&.
Мы можем объявить (но не определить), функции с аргументами и/или возвращаемые значения, типа Foo.
Мы можем объявить статические элементы данных типа Foo. Это вызвано тем, что статические элементы данных определяются вне определения класса.
Вы также можете использовать пересылку 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
Лучший способ сделать это - использовать 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.
Вы можете использовать объект NSProxy
и переопределить метод forwardInvocation:
.