Ios 动态子类化UIViewController的错误 总结

Ios 动态子类化UIViewController的错误 总结,ios,uikit,objective-c-2.0,Ios,Uikit,Objective C 2.0,我正在尝试动态地对对象进行子类化,以便在解除锁定之前进行一些清理。我向对象添加一个子类,并添加自己的dealoc方法来进行清理,然后调用[super dealoc]。这在大多数情况下都有效,但当UIViewController发生这种情况时,我会遇到一些奇怪的情况。似乎dealloc中没有进行某些清理,因为在将-hash发送到解除分配的视图控制器时,我遇到了崩溃 当为新的视图控制器创建视图时会发生这种情况,并且会在UIViewController的类方法中增加一些哈希集。它似乎是视图的视图控制器

我正在尝试动态地对对象进行子类化,以便在解除锁定之前进行一些清理。我向对象添加一个子类,并添加自己的dealoc方法来进行清理,然后调用
[super dealoc]
。这在大多数情况下都有效,但当UIViewController发生这种情况时,我会遇到一些奇怪的情况。似乎dealloc中没有进行某些清理,因为在将-hash发送到解除分配的视图控制器时,我遇到了崩溃

当为新的视图控制器创建视图时会发生这种情况,并且会在UIViewController的类方法中增加一些哈希集。它似乎是视图的视图控制器的散列,因为它位于方法+[UIViewController setViewController:forView:]中

如果我不将我自己的dealloc方法添加到动态子类中,一切都很好。即使我只在自己版本的dealloc中调用
[super dealloc]
,它也会以同样的方式崩溃

有人知道会出什么问题吗?除了调用
[super dealloc]
之外,我还需要做些别的事情,以便它仍然执行它应该执行的所有操作吗

代码 dealloc方法如下所示:

- (void)deallocWithRemoveAllAssociatedBindings {
    [[BindingManager sharedInstance] removeAllBindingsAssociatedWithObject:self];

    [super dealloc];
}
+ (void)createSubclassForObject:(id)object {
    Class objectClass = object_getClass(object);
    NSString *objectClassString = NSStringFromClass(objectClass);
    NSString *subclassName = [NSString stringWithFormat:@"RemoveAllAssociatedBindings_%@", objectClassString];

    Class subclass = objc_getClass([subclassName UTF8String]);
    if (!subclass) {
        subclass = objc_allocateClassPair(objectClass, [subclassName UTF8String], 0);
        if (subclass) {
            Method dealloc = class_getInstanceMethod(self, @selector(deallocWithRemoveAllAssociatedBindings));
            class_addMethod(subclass, @selector(dealloc), method_getImplementation(dealloc), method_getTypeEncoding(dealloc));
            [self addRemoveMethodToClass:subclass];
            objc_registerClassPair(subclass);
        }
    }

    if (!!subclass) {
        object_setClass(object, subclass);
    }
}
我的动态滑动方法如下所示:

- (void)deallocWithRemoveAllAssociatedBindings {
    [[BindingManager sharedInstance] removeAllBindingsAssociatedWithObject:self];

    [super dealloc];
}
+ (void)createSubclassForObject:(id)object {
    Class objectClass = object_getClass(object);
    NSString *objectClassString = NSStringFromClass(objectClass);
    NSString *subclassName = [NSString stringWithFormat:@"RemoveAllAssociatedBindings_%@", objectClassString];

    Class subclass = objc_getClass([subclassName UTF8String]);
    if (!subclass) {
        subclass = objc_allocateClassPair(objectClass, [subclassName UTF8String], 0);
        if (subclass) {
            Method dealloc = class_getInstanceMethod(self, @selector(deallocWithRemoveAllAssociatedBindings));
            class_addMethod(subclass, @selector(dealloc), method_getImplementation(dealloc), method_getTypeEncoding(dealloc));
            [self addRemoveMethodToClass:subclass];
            objc_registerClassPair(subclass);
        }
    }

    if (!!subclass) {
        object_setClass(object, subclass);
    }
}

你可以在github上看到完整的代码:

你不应该自己调用dealloc,这是苹果的工作。我的建议是重写标准的dealloc方法,并使用if语句添加所需的检查,以执行“自定义dealloc”操作。或者您可以从dealloc内部调用自定义dealloc,就像[super dealloc]的调用方式一样。。。或者干脆用弧线