首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的isa-swizzling打断KVO

我的isa-swizzling打断KVO
EN

Stack Overflow用户
提问于 2012-06-27 07:11:38
回答 1查看 2.5K关注 0票数 5

我试图实现,因为我需要在某些对象的dealloc方法中执行一些操作。我正在重写-( class )类;返回原始类的方法(如KVO所做的)。所有操作都很好,直到我尝试将观察者添加到swizzled对象。它只是崩溃了。

  1. 0x00000000 ()
  2. _NSKeyValueRetainedObservationInfoForObject ()中的0x0091d22a
  3. 0x0092ec88 in -addObserver:forProperty:options:context:
  4. 0x0092d6fd in -NSObject(NSKeyValueObserverRegistration) addObserver:forKeyPath:options:context:

以下是swizzling的实现

代码语言:javascript
复制
- (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,它只是一种类保持方法(这和添加原始函数没有什么区别)。

代码语言:javascript
复制
@implementation MDDummy
- (void)dealloc
{

    //Special thinngs

    [super dealloc];
}

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

编辑:

下面是class_addMethodFromClass函数的实现:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-05 21:58:38

您应该看看Mike是如何处理这个问题的:https://github.com/mikeash/MAZeroingWeakRef

摘要:句柄摆动一个KVO-swizzled子类不同-您将不得不修补KVO子类中的KVO方法.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11221110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档