5

Tôi đang cố gắng triển khai isa swizzling vì tôi cần một số hành động xảy ra trong phương thức dealloc của đối tượng nhất định. Tôi đang ghi đè - (lớp) lớp; phương thức trả về lớp gốc (như KVO). Tất cả mọi thứ hoạt động tốt, cho đến khi tôi cố gắng thêm người quan sát vào đối tượng bị quấy rầy. Nó chỉ bị treo.Điểm ngắt quãng của tôi KVO

  1. 0x00000000 trong 0x00000000()
  2. 0x0091d22a trong _NSKeyValueRetainedObservationInfoForObject()
  3. 0x0092ec88 trong - [NSObject (NSKeyValueObserverRegistration) _addObserver: forProperty: tùy chọn: bối cảnh:]()
  4. 0x0092d6fd trong - [NSObject (NSKeyValueObserverRegistration) addObserver: forKeyPath: options: context:]()

Đây là việc thực hiện 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 nó chỉ là một phương pháp giữ lớp theo convinietn (không có sự khác biệt giữa điều này và thêm chức năng thô).

@implementation MDDummy 
- (void)dealloc 
{ 

    //Special thinngs 

    [super dealloc]; 
} 

- (Class)class 
{ 
    return //original class; 
} 
@end 

EDIT:

Đây là việc thực hiện các chức năng 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

Bạn có thêm người quan sát vào đối tượng trước hoặc sau khi làm phiền lớp học không? –

+0

KVO [cũng được triển khai bằng kỹ thuật isa swizzling] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html), vì vậy không ngạc nhiên khi KVO dừng lại để làm việc sau khi spivveries của bạn – NAlexN

Trả lời

3

Bạn nên kiểm tra như thế nào Mike Ash xử lý này: https://github.com/mikeash/MAZeroingWeakRef

Tóm tắt: xử lý swizzling một lớp con KVO-swizzled khác nhau - bạn sẽ phải vá các phương thức KVO trong phân lớp KVO ...

Các vấn đề liên quan