0

我们正在子类化UITabBarController以及UITabBarControllerDelegate处理与选项卡开关有关的某些事件。

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

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

由于我们将项目转换为 ARC,因此委托被提前释放,这导致选项卡切换运行到已释放的实例中。

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

我该怎么做才能使委托对象“活”得比 init 方法长?

4

2 回答 2

2

是的,这在 ARC 下是正常的,因为没有提及它(又名强属性),它应该在周期结束时发布。

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

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

于 2012-12-12T12:31:36.240 回答
2

按照您的操作方式,预计委托不会超过对象,因为它很弱。请记住,您创建了对象,由您决定是否保留它。

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

委托的意义在于,它为一个类提供了一个类不能为自己添加的方法实现,因为它没有足够的信息。例如,表视图委托。为了通用,表格视图不知道要显示多少行或部分,因此它要求它的委托提供此信息。

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

于 2012-12-12T12:37:01.200 回答