Использование сохранения в 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, похоже, на стороне нет, но никогда не давала что я вижу.