我试图实现,因为我需要在某些对象的dealloc方法中执行一些操作。我正在重写-( class )类;返回原始类的方法(如KVO所做的)。所有操作都很好,直到我尝试将观察者添加到swizzled对象。它只是崩溃了。
以下是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);
}发布于 2013-02-05 21:58:38
您应该看看Mike是如何处理这个问题的:https://github.com/mikeash/MAZeroingWeakRef
摘要:句柄摆动一个KVO-swizzled子类不同-您将不得不修补KVO子类中的KVO方法.
https://stackoverflow.com/questions/11221110
复制相似问题