5

특정 개체의 dealloc 메서드에서 발생할 몇 가지 작업이 필요하기 때문에 나는 스와즐링을 구현하려고합니다. 나는 (클래스) 클래스를 오버라이드하고있다; 메서드를 사용하여 원래 클래스를 반환합니다 (KVO 에서처럼). 관측자를 물결 모양의 물체에 추가하려고 할 때까지 모든 것이 잘 작동합니다. 그냥 충돌합니다. [: forProperty : 선택해 문맥 : NSObject의 (NSKeyValueObserverRegistration) _addObserver() 내 isa-swizzling 나누기 KVO

  • 0x0092d6fd로 - - [NSObject를 0x00000000의() 안에 _NSKeyValueRetainedObservationInfoForObject()
  • 0x0092ec88에
  • 0x0091d22a에

    1. 을 0x00000000 (NSKeyValueObserverRegistration) addObserver : forKeyPath : options : 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 그냥 convinientn 방식으로 메서드를 유지하는 클래스입니다 (이 함수와 raw 함수를 추가 할 때 차이점은 없습니다).

    @implementation MDDummy 
    - (void)dealloc 
    { 
    
        //Special thinngs 
    
        [super dealloc]; 
    } 
    
    - (Class)class 
    { 
        return //original class; 
    } 
    @end 
    

    편집 :

    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 technique을 사용하여 구현되었습니다] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html), KVO가 멈추는 것은 놀라운 일이 아닙니다 당신의 후회를 위해 일하게 – NAlexN

    답변

    3

    당신은 마이크 애쉬이 처리하는 방법을 확인해야합니다 :

    여기 class_addMethodFromClass 기능의 구현입니다 https://github.com/mikeash/MAZeroingWeakRef

    요약 : KVO - 스위 즐링 서브 클래스를 스위 즐링 처리 다르게 - KVO 하위 클래스에서 KVO 메서드를 패치해야합니다.