2010-04-16 67 views
0

我正在做一些归档到属性列表,当我使用NSKeyedUnarchiver取消存档数据时,发现我的应用程序崩溃,如果我之后释放对象。我想知道如果finishDecoding消息也autoreleases对象。似乎很奇怪,它在我释放时崩溃。NSKeyedUnarchiver autorelease?

+0

如果方法名称中没有拷贝,并且没有用alloc,new或retain消息对象,那么你不应该释放它。因此,如果您想拥有它们并且您不应该释放它们/除非/您保留或复制它们,则必须保留或复制您在NSKeyedUnarchiver中使用便捷方法取消归档的对象。 – 2010-04-16 17:00:30

回答

2

你释放什么? NSKeyedUnarchiver或unarchived对象?

你是否应该释放NSKeyedUnarchiver取决于你是如何创建它的。它遵循通常的规则。如果你使用alloc + initForReadingWithData你应该释放,如果你使用unarchiveObjectWithDataunarchiveObjectWithFile - 你不应该。

关于decodeObjectForKey的结果,它也遵循通常的规则,该方法返回自动释放对象,除非明确保留它,否则不应释放它。

关于finishDecoding:您需要在NSKeyedUnarchiver对象发布之前显式调用它。在那之后你不应该使用unarchiver,但对象仍然活着。

0

如果初始化

[[NSKeyedUnarchiver alloc] initForReadingWithData:data] 

的取档那么你是负责释放它,当溜溜完成解除存档。

如果它在发布后崩溃了,那么它可能是您的错误在别处。可能是因为您正在使用您的unarchiver提供的对象而不保留它们。当解除分配器被释放时,它释放为您提供的对象。如果你没有保留这些对象,它们将被释放,当你引用这些对象时你会崩溃。