Подход @Till к Method Swizzling - это то, как вы этого добиваетесь. У Майка Эша есть один из лучшие описания того, как это сделать. В настоящее время я одобряю его подход Direct Override, хотя я немного переработал его следующим образом:
#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. Вы можете захватить вид прокрутки и класс переместить его в свой собственный подкласс. Я упоминал, что у вас не должно быть собственного хранилища иваров? Ошибки, которые вы создадите, если выделите ивар в этом и умопомрачительном. Деусти хорошо описывает это в своем блоге. (Это был его код, к которому я добавил ивар и столкнулся с невероятно умопомрачительными ошибками, упомянутыми выше.)
Опять же, это хрупкая, сумасшедшая, опасная техника. Это также иногда может быть самым элегантным и удобным способом сделать то, что вам нужно.
person
Rob Napier
schedule
17.05.2011