2012-11-13 53 views
1

當對象的屬性在存檔和取消存檔過程之間發生變化時,我對NSKeyedArchiver和NSKeyedUnarchiver有點掙扎。這裏有一個具體的例子:如何在版本化類中使用NSCoder

我有一個類,比方說Task,它具有的屬性namedesc,既NSString型。現在,我使用NSKeyedArchiver archivedDataWithRootObject進行歸檔並將其寫入文件。我稍後可以從一個文件中讀取它,並使用NSKeyedUnarchiver unarchiveObjectWithData(data)來回到我想要的位置。當Task獲得一個新的屬性,併爲了讓事情變得有趣,就會失去一個。

所以現在,Taskname,這是一個NSString,但desc缺失。此外,我添加NSDate類型的屬性dateDue。然後啓動模擬器。問題是沒有存檔的是舊的Task與舊的desc屬性,但不是新的dateDue

我的initFromCoder實際上考慮了當前類中沒有屬性並且不嘗試對其進行解碼的情況。

有沒有辦法解釋NSCoder方法不要創建一個對象的確切副本,因爲它是我序列化它的時候(我意識到這是序列化/反序列化定義的一部分),而是讓我版本的靈活性?

感謝

回答

1

有一個簡單的方法 - 寫版本的數據,並把它讀作的initFromCoder開始。如果版本比較失敗,只需從初始化程序返回nil即可。

當您添加屬性時,即使您嘗試解碼數據,您也會得到一個nil值。您始終可以檢查nil值。

當您刪除屬性時,應該沒有任何問題。

請注意,你是一個實現編碼和解碼的人,所以你可以以任何你想要的方式實現它。

相關問題