Я предполагаю, что вам нужно вызвать исходную реализацию после выполнения вашего NSLog; если нет, вы можете просто использовать категорию в классе, чтобы переопределить метод.
Чтобы прокачать метод, сначала вам нужен метод замены. Обычно я помещаю что-то вроде этого в категорию целевого класса:
- (void)replacementReceiveMessage:(const struct BInstantMessage *)arg1 {
NSLog(@"arg1 is %@", arg1);
[self replacementReceiveMessage:arg1];
}
Похоже, что он будет рекурсивно вызывать сам себя, но этого не произойдет, потому что мы собираемся поменять местами, поэтому вызов ReceiveMessage:
вызывает этот метод, а вызов replacementReceiveMessage:
вызывает старую версию.
Второй шаг — использовать функции времени выполнения для фактического выполнения свопа. Преимущество использования категории в том, что вы можете использовать load
в категории для выполнения работы:
+ (void)load {
SEL originalSelector = @selector(ReceiveMessage:);
SEL overrideSelector = @selector(replacementReceiveMessage:);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method overrideMethod = class_getInstanceMethod(self, overrideSelector);
if (class_addMethod(self, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
class_replaceMethod(self, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, overrideMethod);
}
}
Есть два случая, которые необходимо обработать:
- Если метод, который мы изучаем, на самом деле определен в суперклассе, мы должны использовать
class_addMethod
, чтобы добавить реализацию ReceiveMessage:
в целевой класс, что мы и делаем, используя нашу замену реализации. Затем мы можем использовать class_replaceMethod
для замены replacementReceiveMessage:
реализацией суперкласса, чтобы наша новая версия могла корректно вызывать старую.
- Если метод определен в целевом классе,
class_addMethod
потерпит неудачу, но тогда мы можем использовать method_exchangeImplementations
, чтобы просто поменять местами новую и старую версии.
person
Anomie
schedule
20.03.2011