Использование сохранить в initWithCoder? - PullRequest
10 голосов
/ 30 октября 2009

Я читаю о кодировании и декодировании, и я заметил, что иногда люди пропускают сохранение с конца, я также заметил, что сохранение иногда используется для некоторых varables, но не для других. Могу я спросить ...

(1) Какова цель этого сохранения и почему он иногда не нужен?

(2) Означает ли использование сохранения, что мне нужно сопоставить его с выпуском, и если да, то где?

- (id) initWithCoder: (NSCoder *) decoder {
    name  = [[decoder decodeObjectForKey: @"CardName"] retain];
    email = [[decoder decodeObjectForKey: @"CardEmail"] retain];
}

или

- (id) initWithCoder: (NSCoder *) decoder {
    name  = [decoder decodeObjectForKey: @"CardName"];
    email = [decoder decodeObjectForKey: @"CardEmail"];
}

* 1015 Гэри *

Ответы [ 2 ]

12 голосов
/ 30 октября 2009

Ваш первый фрагмент представляет правильное поведение. Метод -decodeObjectForKey: не содержит слова init, copy или new, поэтому нет никаких обещаний относительно того, останется ли возвращаемый объект и, если да, то как долго. Если ваш объект нуждается в своих иварах, чтобы остаться, он должен -retain объекты, которые он получает от декодера. Этот -retain необходимо будет сбалансировать с помощью -release, который будет использоваться в методе -dealloc вашего объекта (поэтому объект создается с некоторыми первоначальными иварами, которые он сохраняет, и освобождает свои ивары при уничтожении). Как это:

- (void)dealloc {
  [name release];
  [email release];
  [super dealloc];
}

Танец сохранения / освобождения не требуется:

  • если вы используете сборщик мусора

  • если ваш объект не нуждается в праве собственности на свои ивары. Это не часто так; делегаты обычно не сохраняются (но, как правило, также не архивируются), а свойства, объявленные с модификатором assign, также не являются.

9 голосов
/ 31 октября 2009

Возможно, вас также вводили в заблуждение люди, использующие свойства. Возможно, вы видели, как люди делают:

- (id) initWithCoder: (NSCoder *) decoder {
    self.name  = [decoder decodeObjectForKey: @"CardName"];
    self.email = [decoder decodeObjectForKey: @"CardEmail"];
}

, что было бы хорошо, если бы имя и адрес электронной почты были определены как «сохранить» свойства. Конечно, вы затем вступаете в спор о том, является ли законным / целесообразным использование методов доступа к свойствам в методах инициализации / деаллока - некоторые говорят «да», некоторые говорят «нет», кажется, что Apple на стороне «нет», но на самом деле никогда не давала хорошая причина, которую я вижу.

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