1

我有一个 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

4

3 回答 3

5

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

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

于 2009-04-26T15:49:37.767 回答
1

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

于 2009-04-26T15:48:44.163 回答
0

这一切都取决于您对表格视图的使用。

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

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

有时最好使用单例委托。

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

于 2010-11-03T19:02:04.643 回答