@ Подход Тилля к Методу Swizzling заключается в том, как вы этого добиваетесь. У Майка Эша есть одна из лучших статей о том, как это сделать. В настоящее время я предпочитаю его метод прямого переопределения, хотя я немного переработал его следующим образом:
#import <objc/runtime.h>
@interface NSObject (RNSwizzle)
+ (IMP)swizzleSelector:(SEL)origSelector withIMP:(IMP)newIMP;
@end
@implementation NSObject (RNSwizzle)
+ (IMP)swizzleSelector:(SEL)origSelector withIMP:(IMP)newIMP {
Class class = [self class];
Method origMethod = class_getInstanceMethod(class, origSelector);
IMP origIMP = method_getImplementation(origMethod);
if(!class_addMethod(self, origSelector, newIMP,
method_getTypeEncoding(origMethod)))
{
method_setImplementation(origMethod, newIMP);
}
return origIMP;
}
@end
Учитывая его пример, вы бы использовали мой метод следующим образом:
gOrigDrawRect = [UIView swizzleSelector:@selector(drawRect:)
withIMP:OverrideDrawRect];
Это все документированные вызовы, которые не используют частные API Apple. Apple иногда отклоняет приложения, которые вносят слишком существенные изменения в ожидаемое поведение пользовательского интерфейса (независимо от того, как они это делают), но я доставил материал с довольно существенными скрытыми изменениями пользовательского интерфейса без проблем, и это не зависит от частного API-интерфейсы.
Это не значит, что метод Swizzling стабилен. Это хрупкая техника, которая делает вас более зависимыми от недокументированных внутренних органов. Это может означать, что вам придется больше карабкаться, если Apple что-то изменит.
(Глубокое дыхание)
Есть еще один подход, который вы можете использовать здесь, если вам не нужно хранить ivar. Вы можете получить представление прокрутки и класс переместиться в ваш собственный подкласс. Я упоминал, что у вас не должно быть собственного хранилища ивара? Ошибки, которые вы создадите, если выделите в этом ивару и умопомрачительные. Дасти хорошо пишет об этом в своем блоге . (Именно по его коду я добавил ивар и столкнулся с невероятно изумительными ошибками, упомянутыми выше.)
Опять же, это хрупкая, безумная, опасная техника. Иногда это может быть самый элегантный и удобный способ сделать то, что вам нужно.