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

Cra*_*tis 1 iphone memory-management properties objective-c autorelease

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

SubjectTableViewHandler *handler = [[[SubjectTableViewHandler alloc] init] retain];
tv.delegate = handler;
tv.dataSource = handler;
[handler autorelease];
Run Code Online (Sandbox Code Playgroud)

我不想将处理程序维护为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.
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*don 5

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

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