【问题标题】:In dealloc method set any delegate to nil is needed or not needed在 dealloc 方法中,需要或不需要任何委托到 nil
【发布时间】:2011-10-03 07:43:36
【问题描述】:

我已经通过如下程序在我的视图中创建了 tableview

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, 320, 370) style:UITableViewCellStyleDefault];
table.delegate = self;
table.dataSource = self;
table.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:table]; 

在dealloc方法中我写如下

table.delegate = nil;
 table.dataSource = nil;
[table release];
table=nil;

这是更好的方式或低于一个更好

[table release];
table=nil;

我想知道如果我不重置委托和数据源会发生什么

感谢

【问题讨论】:

标签: iphone objective-c uitableview


【解决方案1】:

如果您要解除分配充当其他对象的委托的对象,则需要确保在调用 [super dealloc] 之前已将其委托设置为 nil(假设对象不保留其委托的正常模式)。这是因为当[super dealloc] 返回时,此对象不再是有效对象,并且它是有效地具有悬空引用的委托对象(如果它们尚未设置为 nil)。

在这种特殊情况下,您可能不会这样做,因为您的对象的 dealloc 可能不会被调用,除非 UI 被拆除并且表格视图不再需要使用它的委托或数据源,但是不要不要赌它。

【讨论】:

    【解决方案2】:

    来自Setting delegate to nil in dealloc

    这是一种防御性的编程动作。它正在清除对委托对象的引用,以防在你告诉它你已经完成它之后,你的对象中的其他东西试图访问委托。作为你的 dealloc 的一部分,你可能有一个方法或做一些事情来触发一个调用委托的 KVO 通知。因此,将委托的引用设置为 nil 可以防止这种情况发生。如果确实发生了,您最终可能会遇到一些奇怪的崩溃,这些崩溃很有趣,可以重现和修复。

    【讨论】:

      【解决方案3】:

      要添加到上面的答案,你不需要

      table = nil;
      

      在你的dealloc中。它不会受到伤害,但没有必要消除你的 ivars。您的视图正在被解除分配,因此您的 ivars 将不再可访问。你可能会混淆:

      self.table = nil;
      

      如果您通过属性访问 ivar,它可以作为另一种释放方式。

      当然,如果您打开了 ARC,那么您根本不需要发布。

      为了回答您的实际问题,如果您不在视图的 dealloc 上取消表的委托和数据源......什么都不会发生。它们被设置为正在发布的视图。在这种情况下,您不会有任何问题。理论上是好的形式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        相关资源
        最近更新 更多