1
顯然,我不應該做正確的事情,但這種情況隨機發生。我無法通過執行某些步驟來顯示問題,因此調試變得非常困難。我有一個應用程序,每次添加對象或刪除它時,都會將文件寫入plist。我可以在模擬器中驗證plist,並且每次調用我的保存函數時也都有一個NSLog。數據在調用applicationWillEnterForeground時加載,該數據也正常工作。在啓動應用程序後的某些情況下,它將恢復到最近一次更改之前的保存。 iOS緩存數據文件嗎?如果它試圖從磁盤加載一個文件到一個數組,是否有可能已經有一個緩存中的前一個加載,並用這些數據創建數組呢?重啓應用程序後iOS上的隨機數據丟失
保存方法:
- (void)saveFile {
// saves data to file
NSLog(@"save file reached");
#ifdef LITE_VERSION
[self.aquariums writeToFile:[self dataFilePathLite] atomically:YES];
#else
[self.aquariums writeToFile:[self dataFilePath] atomically:YES];
#endif
}
Load方法;我剛剛添加的if (self.aquariums == null)
檢查,它可能已經解決了這個問題,但對我來說很難確認,因爲我不能重現問題:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
/*
Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
*/
NSLog(@"applicationDidBecomeActive called");
if (self.aquariums == NULL) {
NSLog(@"aquariums null, loading file");
#ifdef LITE_VERSION
NSString *filePath = [self dataFilePathLite];
#else
NSString *filePath = [self dataFilePath];
#endif
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
self.aquariums = array;
[array release];
[self update21];
} else {
#ifdef LITE_VERSION
[self convertFileName];
#else
[self update20];
#endif
}
application.applicationIconBadgeNumber = 0;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
aquaPlannerAppDelegate_iPad *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.rootView viewDidAppear:YES];
}
}
}
你有沒有重新加載數據已記錄filePath,即在加載函數以及保存函數中?您需要修改save方法來設置filePath,方法與以下相同。 –
什麼版本的iOS? – JoePasq
一些已經報告在最新的4.3操作系統中的數據丟失,加載和保存工作正常,所以文件路徑是正確的,只是在保存方法我沒有創建一個字符串。數據丟失發生在我看來是隨機的,應用程序加載了以前的保存,而不是最新的保存。 – zambono