2010-10-23 50 views
2

我用下面的代碼寫入到plist中(已填充假設字典)工作原理:在我的應用程序委託將writeToFile:原子:不是4.1 SDK的工作和下方,但在4.2測試版SDK

[dict writeToFile:[appDelegate dataFilePath] atomically:YES]; 

哪裏:

- (NSString *)dataFilePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:kFilename]; 
} 

而且我用這個從磁盤中讀取的plist:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:[appDelegate dataFilePath]]; 

編譯我的AP時,該工作p爲4.2,但由於我把它分配到4.1分配,它停止工作。

[dict writeToFile:[appDelegate dataFilePath] atomically:YES]; 

返回NO。這裏有什麼問題?

+0

iOS 4.2是一個測試版,你不能在蘋果自己的論壇中討論任何其他地方。 – Emil 2010-10-23 13:07:28

+0

我知道。但從那以後,我意識到這與SDK版本的差異毫無關係。 – quantum 2010-10-29 00:00:32

回答

3

我猜想其他一些變化會導致字典中出現非plist類型的對象。看看你是否分離出「生成的plist」和「寫的plist」的步驟會發生什麼:

/* Generate plist. */ 
NSError *error = nil; 
NSData *data = [NSPropertyListSerialization 
       dataFromPropertyList:dict 
       format:NSPropertyListBinaryFormat_v1_0 
       options:0/*unused*/ 
       error:&error]; 
if (!data) { 
    NSLog(@"%s: Failed to serialize data: %@", __func__, error); 
    return; 
} 

/* Write data. */ 
NSString *path = [appDelegate dataFilePath]; 
BOOL ok = [data writeToFile:dataFilePath options:NSDataWritingAtomic error:&error]; 
if (!ok) { 
    NSLog(@"%s: Failed to write atomically to path %@: %@", __func__, path, error); 
} 
0

好吧,現在我意識到這無關與基地SDK。我清理了所有目標,現在問題無處不在。我嘗試切換到使用NSUserDefaults而不是writeToFile:atomically:,並且發生同樣的問題。我無法理解這裏有什麼問題!

0

如果它不適用於NSUserDefaults,那麼您的字典中很可能有不符合NSCoding的對象。 你可以使用類似的東西來找出哪個鍵負責這個。當然你也必須檢查你的值。

for (id object in [dict allKeys]) 
    if (![object conformsToProtocol:@protocol(NSCoding)]) 
     NSLog(@"not NSCoding: %@ [%@]", object, [object class]); 
相關問題