2010-04-16 74 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提供的對象而不保留它們。當解除分配器被釋放時,它釋放爲您提供的對象。如果你沒有保留這些對象,它們將被釋放,當你引用這些對象時你會崩潰。