Я читал яблочный документ по управлению памятью и теперь немного растерялся относительно рекомендуемой реализации Accessors. Apple приводит 3 подхода к реализации аксессоров.
Техника 1
Я скопировал код из первой методики, которая отражает: «Получатель сохраняет и автоматически выпускает значение перед его возвратом; установщик освобождает старое значение и сохраняет (или копирует) новое значение». Утверждается, что этот первый метод более надежен, но страдает от снижения производительности на часто вызываемых геттерах.
- (NSString*) title {
return [[title retain] autorelease];
}
- (void) setTitle: (NSString*) newTitle {
if (title != newTitle) {
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
Техника пропуска 2
Техника 3
Третий метод лучше подходит для часто называемых сеттеров и геттеров. Я всегда следовал этому методу.
- (NSString*) title {
return title;
}
- (void) setTitle: (NSString*) newTitle {
if (newTitle != title) {
[title release];
title = [newTitle retain]; // Or copy, depending on your needs.
}
}
Мои вопросы:
(Техника 1) Сеттер сначала сбрасывает существующее значение, даже если оно ни на что не указывает. Это отправит сообщение на nil, которое, как я понимаю, поддерживается в Objective-C, но все равно выглядит странно. Я правильно понимаю?
(Техника 1) Почему удержание складывается внутри автоматического выпуска?
(Техника 1) Ожидается ли, что вызывающий объект, использующий метод получения, вызовет release после того, как он завершил работу с объектом?
Страницу документации разработчика Apple можно найти по адресу: Руководство по программированию управления памятью - методы доступа