3
我有下面的代碼讀取存檔陣列:非常然而崩潰在unarchiveObjectWithFile特定條件下
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if(temp && [temp isKindOfClass:[NSArray class]])
{
self.posts = [temp mutableCopy];
}
下面的代碼是數組
-(void)savePostList
{
NSURL *tempURL = [[[ZZAppDelegate sharedAppDelegate] applicationCacheDirectory] URLByAppendingPathComponent:@"postCache.plist"];
[NSKeyedArchiver archiveRootObject:self.posts
toFile:[tempURL path]];
}
一般來說一切完美保存,特定(目前未確定)的情況下,應用程序在啓動時開始崩潰,但有一個例外:
-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x275900
崩潰實際上是調用內部發生:
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
說完掏出從它看起來非常奇怪的(而且很空)的設備的plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array/>
</plist>
如果我包住整個事情在那麼@try/@catch條款「一切都很好,」像這樣:
@try {
id temp = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if(temp && [temp isKindOfClass:[NSArray class]])
{
self.posts = [temp mutableCopy];
if(self.posts)
{
[self precacheImages];
}
}
}
@catch (NSException *exception) {
// exception thrown - delete file
NSLog(@"An exception occurred reading file - deleting");
NSError * err;
if(![[NSFileManager defaultManager] removeItemAtPath:path error:&err])
{
NSLog(@"Error deleting file: %@", err);
}
}
我的問題是:沒有任何人有任何想法什麼會導致這種(如的.plist是「空」),然後對於unarchiveObjectWithFile調用引起異常的方式(根據堆棧跟蹤位於系統庫內部)。
羅的該部分代碼甚至沒有達到 - 正如我所說的異常被拋出* *裏面的unarchiveObjectWithFile電話。 –
哦是的,這是錯的,你不應該使用鍵控歸檔器來反序列化plist ...編輯 –
歸檔/取消歸檔是正確的,因爲我使用支持NSCoding的非屬性列表安全對象。問題不是'如何去做',因爲我之前做了很多次。問題的根源在於編碼數據如何混亂以致導致unarchiveObjectWithFile崩潰。我已經向蘋果提交了一個錯誤報告,其中包括導致其崩潰的文件。 –