2011-12-03 31 views
0

我想開發一個Cydia的調整,但現在我有一些問題。NSKeyedArchiver不能存檔陣列

我想複製一個NSMutableArray,所以我用:

myArray = %orig; 
NSMutableArray* myArray2; 
myArray2 = myArray; 
NSData* data = [NSKeyedArchiver archivedDataWithRootObject: myArray2]; 

(原函數返回一個NSMutableArray,所以我用myArray的=%原稿;要得到它)

然而,似乎archivedDataWithRootObject不起作用,它總是導致我的設備崩潰。

那麼,archivedDataWithRootObject有沒有限制?我不知道原始的NSMutableArray是否被編碼。我可以將archivedDataWithRootObject用於編碼的NSMutableArra嗎?

感謝您的任何建議和回覆

+0

你能提供一個崩潰日誌嗎?當ObjC應用程序轉儲核心時,它通常會打印出調用堆棧。我很高興看到哪個功能崩潰。你甚至可以使用gdb來檢索它並查看回溯。 – 2011-12-03 18:03:50

+0

似乎我無法得到它們,因爲整個iOS崩潰(respring),我無法在xcode中找到崩潰報告。 – Hiraku

+0

我現在得到日誌。它說:「[UIKBTree encodeWithCoder:]:無法識別的選擇器發送到實例0xe8cdbe0」 – Hiraku

回答

0

我不明白這行代碼在你的代碼:

myArray的=%原稿;

而且我不明白爲什麼你這樣做:

的NSMutableArray * myArray2;
myArray2 = myArray;

如果你有一個NSArray或NSMutableArray裏,你將能夠直接與該行的代碼進行編碼:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject: myArray2]; 

但(總是有作爲,但...)
什麼是否存儲在您的NSArray
如果你得到custom object他們必須實現NSCoding協議才能參與存檔舞蹈。

,最後你說:

我想複製一個NSMutableArray,所以我用:

如果你只是想複製NSMutableArray你可以這樣做:

[[NSMutableArray alloc] initWithArray:anArray]; 

我仍然沒有得到%符號那裏。
如果你需要添加新的對象,爲什麼不簡單就像創建新的對象。如果它是你自己的對象,你有2個選擇:
1你在這些對象上實現NSCopying協議,使它們表現得像你想要的,或者
第二選擇:如果數組包含一個類型的對象,你可以創建一個Class方法那些像這樣的對象:newObjectWithArray:(* NSArray)theArray,並且在那個方法中,您將allocinit對象初始化爲接收對象的值。

+0

甚至是'[NSMutableArray arrayWithArray:anArray]'。 –

+0

是的,但我喜歡避免自動釋放對象,除非需要它們。 –

+0

我使用myArray =%orig;在iOS中獲得該函數返回的原始數組。我試圖用相同的自定義對象中的一些int創建一個NSMutableArray,但我可以使用NSKeyedArchiver來歸檔它們。我會嘗試[[NSMutableArray alloc] initWithArray:anArray] ;. :) – Hiraku