2010-04-16 2 views
0

Я делаю некоторое архивирование в список свойств, и когда я удаляю свои данные с помощью NSKeyedUnarchiver, я обнаружил, что мое приложение сработает, если я отпустил объект позже. Мне было интересно, если сообщение finishDecoding также автореализует объект. Кажется странным, что он падает, когда я его отпускаю.Является ли NSKeyedUnarchiver авторефератом?

+0

Если имя метода не имеет в нем копии, и вы не сообщаете об этом объекте с помощью alloc, new или сохраняете, то вы не должны его отпускать. Таким образом, объекты, которые вы производите с помощью удобных методов в NSKeyedUnarchiver, должны быть сохранены или скопированы, если вы хотите их владеть, и вы не должны выпускать их/если вы не сохранили или не скопировали их. –

ответ

2

Что вы выпускаете? NSKeyedUnarchiver или unarchived object?

Если вы освобождаете NSKeyedUnarchiver или не зависит от того, как вы его создали. Это следует обычным правилам. Если вы используете alloc + initForReadingWithData, вам следует освободить, если вы используете unarchiveObjectWithData или unarchiveObjectWithFile - вам не следует.

Что касается результата decodeObjectForKey, то также следует обычное правило, что метод возвращает объект с автореализацией, и вы не должны отпускать его, если вы его явно не сохранили.

Относительно finishDecoding: вы должны явно вызвать его до выхода объекта NSKeyedUnarchiver. Вы не должны использовать unarchiver после этой точки, но объект все еще жив.

0

Если инициализировать Unarchiver с

[[NSKeyedUnarchiver alloc] initForReadingWithData:data] 

Тогда вы ответственны за освобождение, когда йо сделаны разархивировав.

Если это сбой после его выпуска, значит, ваша ошибка в другом месте. Возможно, потому, что вы используете объекты, которые предоставляет ваш unarchiver, не сохраняя их. И когда unarchiver освобождается, он освобождает объекты, которые вам предоставлены. Если вы не сохранили их, они будут освобождены, и вы столкнетесь, когда будете ссылаться на эти объекты.

Смежные вопросы