Мои ИСА-КУДА КВО
Я пытаюсь реализовать isa swizzling, потому что мне нужно, чтобы какие-то действия происходили в методе dealloc определенного объекта. Я переопределяю - (класс) класс; метод возврата исходного класса (как это делает KVO). Все работает нормально, пока я не попытаюсь добавить наблюдателя к закрученному объекту. Это просто вылетает.
- 0x00000000 в 0x00000000 ()
- 0x0091d22a в _NSKeyValueRetainedObservationInfoForObject ()
- 0x0092ec88 in - [NSObject (NSKeyValueObserverRegistration) _addObserver: forProperty: параметры: контекст:] ()
- 0x0092d6fd in - [NSObject (NSKeyValueObserverRegistration) addObserver: forKeyPath: параметры:context:] ()
Вот реализация изворотливая
- (void)swizzleClass
{
NSString *proxyClassName = [NSString stringWithFormat:@"MDSwizzled_%@", NSStringFromClass(self->isa)];
Class proxyClass = NSClassFromString(proxyClassName);
if (!proxyClass)
proxyClass = [self createProxyClassWithName:proxyClassName];
object_setClass(self, proxyClass);
}
- (Class)createProxyClassWithName:(NSString *)proxyClassName
{
const char *c_proxyClassName = [proxyClassName cStringUsingEncoding:NSUTF8StringEncoding];
Class proxyClass = objc_allocateClassPair(self->isa, c_proxyClassName, 0);
Class dummyClass = [MDDummy class];
class_addMethodFromClass(proxyClass, dummyClass, @selector(dealloc));
class_addMethodFromClass(proxyClass, dummyClass, @selector(class));
objc_registerClassPair(proxyClass);
return proxyClass;
}
MDDummy - это просто метод хранения классов (нет разницы между этим и добавлением необработанных функций).
@implementation MDDummy
- (void)dealloc
{
//Special thinngs
[super dealloc];
}
- (Class)class
{
return //original class;
}
@end
РЕДАКТИРОВАТЬ:
Вот реализация функции class_addMethodFromClass:
void class_addMethodFromClass(Class class, Class sourceClass, SEL selector)
{
Method method = class_getInstanceMethod(sourceClass, selector);
IMP methodImplementation = method_getImplementation(method);
const char *types = method_getTypeEncoding(method);
class_addMethod(class, selector, methodImplementation, types);
}
1 ответ
Решение
Вы должны проверить, как Майк Эш справляется с этим: https://github.com/mikeash/MAZeroingWeakRef
Краткое описание: обрабатывать извращение подкласса KVO по-разному - вам придется исправлять методы KVO в подклассе KVO...