2012-04-11 27 views
0

我編碼是這樣的:NSKeyedUnarchiver不能解碼回我保存的對象

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];   
[archiver encodeObject:data forKey:@"Object"]; 
[archiver finishEncoding]; 

然後,從磁盤獲取已保存的文件後,我試着像這樣解碼:

Object *object = (Object*)[unarchiver decodeObjectForKey:@"Object"]; 

問題這是不會解碼回Object *類型的。它仍然是NSMutableData。所以當我嘗試訪問對象的一些屬性,如「object.name」時,我得到 - [NSConcreteMutableData name]:無法識別的選擇器發送到實例0x2c8510'。

我跟隨了Ray Wenderlich的教程http://www.raywenderlich.com/1914/how-to-save-your-app-data-with-nscoding-and-nsfilemanager。即使他的代碼有效,我的代碼不會。所以經過一整天的討論,我正在尋求一些幫助。

回答

2

你舉本教程採用的是在SAVEDATA方法呼籲類「數據」,也可變稱爲「數據」屬性。當他調用encodeObject:時,他將屬性「_data」(或至少合成的實例變量_data)寫入NSMutableData對象「data」。這有點令人困惑,因爲他在兩個不同的事情上使用同一個名字。

您,otoh,正在創建名爲「data」的ivar,然後將其發送給encodeObject :.你永遠不會訪問你的Object *屬性,只需將一個空的NSMutableData寫入一個NSMutableData。區別在於缺少下劃線,但是有更好的方法。

我建議你重新命名你想要編碼的數據的屬性,比如說「信息」(或者更多信息的東西,比如「stockPrices」或「todaysWeather」或者這個類存儲的任何數據)

@property Object* info; 

,並適當地重新命名您的訪問(假設你正在做的事情,他做的方式)

然後寫:

[archiver encodeObject:self.info forKey:@"Object"] 

有兩件事是happeni在這裏爲您的開發者的利益:您正在使用不同的名稱來編碼數據和您正在編碼的信息,並且您在代碼中明確地寫道,您正在訪問您的班級的信息屬性,而不是一些局部變量。這兩種方式都會讓您在閱讀此代碼6個月後更輕鬆。

1

這是因爲你正在編碼data而不是object。此行更改:​​

[archiver encodeObject:data forKey:@"Object"]; 

這個

[archiver encodeObject:object forKey:@"Object"]; 
相關問題