У меня есть экземпляр 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
?