Note that there are some explanatory texts on larger screens.

plurals
  1. POMy isa-swizzling breaks KVO
    primarykey
    data
    text
    <p>I'm trying to implement isa swizzling because I need some actions to happen in dealloc method of certain object. I'm overriding - (Class)class; method to return original class (as KVO does). Everything works fine, until I try to add observer to swizzled object. It just crashes.</p> <ol> <li>0x00000000 in 0x00000000 () </li> <li>0x0091d22a in _NSKeyValueRetainedObservationInfoForObject () </li> <li>0x0092ec88 in -[NSObject(NSKeyValueObserverRegistration) _addObserver:forProperty:options:context:] () </li> <li>0x0092d6fd in -[NSObject(NSKeyValueObserverRegistration) addObserver:forKeyPath:options:context:] ()</li> </ol> <p>Here is implementation of swizzling</p> <pre><code>- (void)swizzleClass { NSString *proxyClassName = [NSString stringWithFormat:@"MDSwizzled_%@", NSStringFromClass(self-&gt;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-&gt;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; } </code></pre> <p>MDDummy it's just a class holding method in convinietn way (there is no difference between this and adding raw functions).</p> <pre><code>@implementation MDDummy - (void)dealloc { //Special thinngs [super dealloc]; } - (Class)class { return //original class; } @end </code></pre> <p>EDIT:</p> <p>Here's implementation of class_addMethodFromClass function:</p> <pre><code>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); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload