Авто-релиз и «назначить» свойства в Objective-C? (На айфоне) - PullRequest
1 голос
/ 26 апреля 2009

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

Ответы [ 3 ]

5 голосов
/ 26 апреля 2009

Когда вы инициализируете объект с помощью init, вы заявляете о праве собственности на него, и нет причин вызывать retain. Вы также не хотите вызывать autorelease, поскольку это приведет к освобождению объекта в цикле выполнения.

Так как вам нужно сохранить обработчик (чтобы ваш tableView мог вызывать методы делегата / dataSource) и ссылку на обработчик после возврата метода (чтобы вы могли освободить его, когда закончите показ tableView), самый чистый подход будет сделать его иваром.

1 голос
/ 26 апреля 2009

Единственное решение, которое я вижу, это, как вы упомянули, сделать его иваром, а также хранить, выделять и освобождать его параллельно с таблицей.

0 голосов
/ 03 ноября 2010

Все зависит от того, как вы используете табличное представление.

Обычной практикой является создание контроллера представления, который является делегатом таблицы, а таблица может быть членом контроллера.

В качестве другой альтернативы вы можете наследовать от UITableView и сделать его делегированным от себя.

Иногда лучше использовать одноэлементный делегат.

Кроме того, в методах делегатов таблиц первым аргументом является представление таблицы, поэтому один объект делегата может обслуживать несколько таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...