ARC - 委托(分配)过早发布

时间:2012-12-12 12:27:49

标签: objective-c automatic-ref-counting

我们正在继承UITabBarController以及UITabBarControllerDelegate来处理有关制表符切换的某些事件。

现在,在我们的自定义标签栏控制器中,我们有:

- (id)initCustomTabBarController {
    self = [super init];
    if(self) {
       [self setDelegate:[[CustomTabBarControllerDelegate alloc] init]];
       // ...
    }
    return self;
}

由于我们将项目转换为ARC,因此委托被释放到早期,导致选项卡切换运行到解除分配的实例。

该属性在assign中定义为UITabBarController.h - 我显然没有影响。

如何使委托对象“实时”比init方法更长?

2 个答案:

答案 0 :(得分:2)

是的,这在ARC下是正常的,因为没有提到它(也就是强大的预言)它应该在周期结束时释放。

只需在您指定CustomTabBarControllerDelegate的类中创建一个属性,使其变得强大。然后将此属性分配给委托。

在非ARC中你设置它的方式可能会造成内存泄漏。

答案 1 :(得分:2)

你完成它的方式,预计委托不会比对象寿命长,因为它很弱。记住,你创建了这个对象,你可以坚持下去。

但是 - 您使用的模式不正确。

委托的要点是,它为类无法为其自身添加的类提供方法实现,因为它没有足够的信息。例如,表视图委托。表视图为了通用,不能知道要显示多少行或部分,因此它要求它的委托提供此信息。

在您的情况下,您有一个对象正在创建它自己的委托。在这种情况下,为什么要费心代表呢?只需在类中实现方法即可。