5

我試圖實施ISA swizzling,因爲我需要一些行動發生在某些對象的dealloc方法。我最重要的是 - (班)班;方法返回原始類(如同KVO一樣)。一切工作正常,直到我嘗試添加觀察員到swizzled對象。它只是崩潰。 [:forProperty:選擇:上下文:NSObject的(NSKeyValueObserverRegistration)_addObserver]() 我isa-swizzling休息KVO

  • 0x0092d6fd在 - - [NSObject的

    1. 在00000000()
    2. 0x0091d22a在 _NSKeyValueRetainedObservationInfoForObject()
    3. 0x0092ec88在00000000 (NSKeyValueObserverRegistration)addObserver:forKeyPath:options:context:]()

    這裏是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 
    

    編輯:

    這裏的實施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); 
    } 
    
  • +0

    在課堂上課之前或之後,您是否將觀察者添加到對象中? –

    +0

    KVO [也是使用isa swizzling技術實現的](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html),所以KVO停止並不奇怪在你的精神分裂後工作 – NAlexN

    回答