My isa -swizzling breaks KVO

Я пытаюсь реализовать isa swizzling, потому что мне нужно, чтобы некоторые действия происходили в методе Dealloc определенного объекта. Я переопределяю-(Класс )класс; метод для возврата исходного класса (, как это делает KVO ). Все работает нормально, пока я не пытаюсь добавить наблюдателя к swizzled объекту. Он просто падает.

  1. 0x00000000 в 0x00000000()
  2. 0x0091d22a в _NSKeyValueRetainedObservationInfoForObject()
  3. 0x0092ec88 в -[NSObject (NSKeyValueObserverRegistration)_addObserver :forProperty :параметры :контекст :]()
  4. 0x0092d6fd в -[NSObject (NSKeyValueObserverRegistration )addObserver :forKeyPath :параметры :контекст :]()

Вот реализация swizzling

- (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

РЕДАКТИРОВАТЬ:

Вот реализация функции класса _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);
}
5
задан Carl Veazey 8 October 2012 в 08:27
поделиться