Использование сохранения в initWithCoder?

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

(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"];
}

Гэри

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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