Методы доступа Objective-C и использование автоматического выпуска - PullRequest
2 голосов
/ 12 января 2011

Я читал яблочный документ по управлению памятью и теперь немного растерялся относительно рекомендуемой реализации 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. (Техника 1) Сеттер сначала сбрасывает существующее значение, даже если оно ни на что не указывает. Это отправит сообщение на nil, которое, как я понимаю, поддерживается в Objective-C, но все равно выглядит странно. Я правильно понимаю?

  2. (Техника 1) Почему удержание складывается внутри автоматического выпуска?

  3. (Техника 1) Ожидается ли, что вызывающий объект, использующий метод получения, вызовет release после того, как он завершил работу с объектом?

Страницу документации разработчика Apple можно найти по адресу: Руководство по программированию управления памятью - методы доступа

Ответы [ 2 ]

6 голосов
/ 12 января 2011

(Техника 1). Сеттер сначала сбрасывает существующее значение, даже если оно ни на что не указывает.Это отправит сообщение на nil, которое, как я понимаю, поддерживается в Objective-C, но все равно выглядит странно.Я правильно понимаю?

Да.Сообщения на nil не имеют значения.

(Техника 1) Почему удержание складывается внутри автоматического выпуска?

Это гарантирует, что следующее не сломается:

x = [foo title];
[foo setTitle: @"bar"];
[x length]; // x has been released, possibly, if -title didn't retain/autorelease

(Техника 1) Ожидает ли вызывающая сторона, которая использует получатель, вызвать вызов release после того, как они сделали с объектом?

Нет.

1 голос
/ 12 января 2011
  1. Посылка сообщения в ноль определена, чтобы ничего не делать.Этот установщик является отличным примером того, как это позволяет вам писать более простой код: [title release] вместо if (title != nil) [title release];.Также обратите внимание, что никаких специальных проверок для nil не требуется для newTitle.

  2. Пара сохранения / автоматического освобождения в получателе означает, что возвращенный объект останется действительным в течение всего времени существования текущей функциивызов (технически, до тех пор, пока пул авто-выпуска не будет слит), даже если вызывается установщик.В цитируемой вами документации приведен пример того, как это может быть полезно, если есть переменная с «не принадлежащей ссылкой» на значение.

  3. NO.Значение уже было автоматически выпущено;звонящий не должен отпускать его снова.

...