繁体   English   中英

动态子类化UIViewController的错误

[英]Bug dynamically subclassing a UIViewController

摘要

我试图动态子类化对象以在取消分配之前进行一些清理。 我向该对象添加一个子类,并添加自己的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

您永远都不应该自己调用dealloc,这就是Apple的工作。 我的建议是重写标准的dealloc方法,并使用if语句添加您需要检查的内容以执行“自定义dealloc”操作。 或者您可以像在[super dealloc]的调用方式一样,从dealloc内部调用自定义的dealloc ...,或者仅使用ARC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM