Bug动态子类化UIViewController

时间:2013-05-06 17:45:21

标签: ios uikit objective-c-2.0

摘要

我试图在dealloc之前动态子类化对象以进行一些清理。我在对象中添加了一个子类,并添加了自己的dealloc方法来进行清理,然后调用[super dealloc]。这适用于大多数情况,但是当UIViewControllers发生时,我遇到了一些奇怪的事情。似乎在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);
    }
}

您可以在github上看到完整代码:https://github.com/drewag/property-bindings

1 个答案:

答案 0 :(得分:0)

你永远不应该自己叫dealloc,这就是苹果公司的工作。我的建议是覆盖标准的dealloc方法,并用if语句添加你需要检查的东西来做你的“自定义dealloc”的东西。或者你可以从dealloc里面调用你的自定义dealloc,就像调用[super dealloc]一样......或者只是使用ARC。