在Objective-C中自动释放和“分配”属性? (在iPhone上)

时间:2009-04-26 15:33:22

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

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

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

3 个答案:

答案 0 :(得分:5)

使用init初始化对象时,您声明拥有该对象,并且没有理由调用retain。您也不想调用自动释放,因为这会导致对象在运行循环中被释放。

由于你需要保留处理程序(以便你的tableView可以调用delegate / dataSource方法)以及在方法返回后对处理程序的引用(因此你可以在完成显示tableView时释放它),所以最干净方法是使它成为一个伊娃。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

有时候使用单身代表会更好。

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