动态子类化 UIViewController 的错误

Posted

技术标签:

【中文标题】动态子类化 UIViewController 的错误【英文标题】:Bug dynamically subclassing a UIViewController 【发布时间】:2013-05-06 17:45:20 【问题描述】:

总结

我正在尝试动态子类化对象以在 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】:

你永远不应该自己调用 dealloc,那是苹果的工作。我的建议是覆盖标准的 dealloc 方法,并使用 if 语句添加您需要的检查来执行您的“自定义 dealloc”内容。或者您可以像调用 [super dealloc] 一样从 dealloc 内部调用您的自定义 dealloc... 或者只使用 ARC。

【讨论】:

以上是关于动态子类化 UIViewController 的错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITableView 子类化 UIViewController

如何在许多子类中使用 UITableViewDelegate 子类化 UIViewController

子类化 UIView/UIViewController

子类化 UIViewController 时调用 viewDidLoad 是啥?

子类化 UIViewController 导致内存问题?

子类化 UIViewController 实现 UITableView 委托和数据源:代码重用