5
我試圖實施ISA swizzling,因爲我需要一些行動發生在某些對象的dealloc方法。我最重要的是 - (班)班;方法返回原始類(如同KVO一樣)。一切工作正常,直到我嘗試添加觀察員到swizzled對象。它只是崩潰。 [:forProperty:選擇:上下文:NSObject的(NSKeyValueObserverRegistration)_addObserver]() 我isa-swizzling休息KVO
- 在00000000()
- 0x0091d22a在 _NSKeyValueRetainedObservationInfoForObject()
- 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);
}
在課堂上課之前或之後,您是否將觀察者添加到對象中? –
KVO [也是使用isa swizzling技術實現的](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html),所以KVO停止並不奇怪在你的精神分裂後工作 – NAlexN