5

特定のオブジェクトのdeallocメソッドでいくつかのアクションを実行する必要があるため、isaスウィズリングを実装しようとしています。私はオーバーライドしています-(クラス)クラス; 元のクラスを返すメソッド(KVOのように)。スウィズルされたオブジェクトにオブザーバーを追加しようとするまで、すべてが正常に機能します。クラッシュするだけです。

  1. 0x00000000の0x00000000()
  2. _NSKeyValueRetainedObservationInfoForObjectの0x0091d22a()
  3. 0x0092ec88 in-[NSObject(NSKeyValueObserverRegistration)_addObserver:forProperty:options:context:]()
  4. 0x0092d6fd in-[NSObject(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は、従来の方法でクラスを保持するメソッドにすぎません(これとraw関数の追加に違いはありません)。

@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);
}
4

1 に答える 1

4

Mike Ashがこれをどのように処理するかを確認する必要があります:https ://github.com/mikeash/MAZeroingWeakRef

概要:KVOスウィズルサブクラスのスウィズリングの処理方法は異なります。KVOサブクラスのKVOメソッドにパッチを適用する必要があります...

于 2013-02-05T21:58:38.983 に答える