2011-10-01 56 views
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]; 
     } 
} 
} 
+0

你有沒有重新加載數據已記錄filePath,即在加載函數以及保存函數中?您需要修改save方法來設置filePath,方法與以下相同。 –

+0

什麼版本的iOS? – JoePasq

+0

一些已經報告在最新的4.3操作系統中的數據丟失,加載和保存工作正常,所以文件路徑是正確的,只是在保存方法我沒有創建一個字符串。數據丟失發生在我看來是隨機的,應用程序加載了以前的保存,而不是最新的保存。 – zambono

回答

0

釋放並沒有得到數據丟失的任何報告的問題必須經過肯定已經

if (self.aquariums == NULL) { 

讓人們記住,如果你打算從時,在後臺的應用程序返回將其設置爲第一個空和釋放

aquariums = NULL; 
[aquariums release]; 
相關問題