我有一个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
方法中释放它?
答案 0 :(得分:5)
使用init初始化对象时,您声明拥有该对象,并且没有理由调用retain。您也不想调用自动释放,因为这会导致对象在运行循环中被释放。
由于你需要保留处理程序(以便你的tableView可以调用delegate / dataSource方法)以及在方法返回后对处理程序的引用(因此你可以在完成显示tableView时释放它),所以最干净方法是使它成为一个伊娃。
答案 1 :(得分:1)
我能看到的唯一解决方案是,正如您所提到的,将其设为ivar并与表并行存储,分配和解除分配。
答案 2 :(得分:0)
这完全取决于您对表格视图的使用。
通常的做法是创建一个视图控制器,它是表的委托,表可以是控制器的成员。
作为另一种选择,您可以从UITableView继承并使其成为自己的委托。
有时候使用单身代表会更好。
另外,在表委托方法中,第一个参数是tableview,因此一个委托对象可以为多个表提供服务。