특정 개체의 dealloc 메서드에서 발생할 몇 가지 작업이 필요하기 때문에 나는 스와즐링을 구현하려고합니다. 나는 (클래스) 클래스를 오버라이드하고있다; 메서드를 사용하여 원래 클래스를 반환합니다 (KVO 에서처럼). 관측자를 물결 모양의 물체에 추가하려고 할 때까지 모든 것이 잘 작동합니다. 그냥 충돌합니다. [: forProperty : 선택해 문맥 : NSObject의 (NSKeyValueObserverRegistration) _addObserver() 내 isa-swizzling 나누기 KVO
- 을 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);
}
클래스를 뒤집기 전이나 후에 오브젝트에 옵저버를 추가하고 있습니까? –
KVO [isa swizzling technique을 사용하여 구현되었습니다] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html), KVO가 멈추는 것은 놀라운 일이 아닙니다 당신의 후회를 위해 일하게 – NAlexN