【问题标题】:Autorelease and "assign" properties in Objective-C? (On iPhone)Objective-C 中的自动释放和“分配”属性? (在 iPhone 上)
【发布时间】:2009-04-26 15:33:22
【问题描述】:

我有一个 UITableView 的实例,以及一个遵循委托和数据源协议的单独类。我这样做是这样的:

SubjectTableViewHandler *handler = [[[SubjectTableViewHandler alloc] init] retain];
tv.delegate = handler;
tv.dataSource = handler;
[handler autorelease];

我不想将处理程序维护为 ivar,如果我在最后取消retain 调用,当autorelease 发生时,它会发送release,然后添加到池中,这会导致 EXC_BAD_ACCESS。所以目前,保留计数是:

(1) At init: 1
(2) At retain: 2
(3) delegate/datasource properties are 'assign', still 2
(4) At autorelease: 1, now in autorelease pool.

但是由于属性是“分配”,它们永远不会被释放,保留计数永远不会达到 0,并且处理程序永远不会被释放。有没有比将处理程序维护为 ivar 并在 dealloc 方法中释放它更有效的方法来实现这一点?

【问题讨论】:

    标签: iphone objective-c memory-management properties autorelease


    【解决方案1】:

    当您使用 init 初始化对象时,您声明了它的所有权并且没有理由调用保留。您也不想调用 autorelease,因为这会导致对象在运行循环时被释放。

    由于您需要保留处理程序(以便您的 tableView 可以调用委托/数据源方法)和方法返回后对处理程序的引用(以便您可以在完成显示 tableView 时释放它),最干净方法是使其成为 ivar。

    【讨论】:

    • 在这里同意。不要与框架抗争。您是否有不想使用 ivar 的特定原因?
    • 拥有 ivar 在概念上没有意义,因为设置处理程序的方法之外的变量没有用处。完美的解决方案是如果数据源/委托属性是“保留”。然后它们可以被设置和释放,设置它们的类就不需要再担心了。
    • 我认为将其设置为分配的原因是您不会创建保留周期。您经常创建从成为委托的对象中获取委托的对象。在这种情况下,您不希望该对象保留它的委托,而它的委托保留该对象。
    【解决方案2】:

    正如您所提到的,我能看到的唯一解决方案是使其成为 ivar,并与表并行存储、分配和解除分配。

    【讨论】:

    • 我想知道为什么这被否决为-2?在某处的实例变量中存储对数据源的引用正确的做法。
    • 我无法取消投票,但马克是正确的。我最初可能误读了,但为了记录,我错误地否决了这个答案。 (对不起)
    【解决方案3】:

    这完全取决于您对表格视图的使用。

    通常的做法是创建一个视图控制器,它是表的委托,而表可能是控制器的成员。

    作为另一种选择,您可以从 UITableView 继承并使其成为自身的委托。

    有时最好使用单例委托。

    此外,在表委托方法中,第一个参数是 tableview,因此一个委托对象可以服务多个表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多