2012-03-17 54 views
1

我的目標是能夠更新NSUserDefaults中的對象。從NSUserDefaults中刪除數組時出現內存問題

這是我的方法,我擔心的是當我使用removeObjectForKey替換數組時,是否存在可以創建的內存問題。通過initWithArray:將數組中的對象保存在objectArray中: oldSavedArray是包含NSUserDefaults以前內容的數組。

objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray]; 

if ([objectArray containsObject:myObject]){ 

      // remove the current object 
      [objectArray removeObject:_currentFood]; 

      // reset our new array of objects 
      [_defaults removeObjectForKey:@"mySavedData"]; 
      [_defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"mySavedData"]; 
     } 
     else{ 

      // add the current object 
      [objectArray addObject:_currentFood];     

      // reset our new array of favorite food 
      [_defaults removeObjectForKey:@"mySavedData"]; 
      [_defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"mySaveData"]; 
     } 
+0

我認爲這是我的EXC_BAD_ACCESS錯誤的來源... – Apollo 2012-03-17 01:50:39

回答

1

要回答你的問題

有沒有用「removeObjectForKey」任何內存問題?

我的答案是否定的。但是這一步沒有必要。

[defaults setObject:forKey:] 

就足夠了。

+0

so setObject:forkey實際上會覆蓋之前保存在該鍵下的任何對象? – Apollo 2012-03-17 02:41:00

+0

這個答案是對的,我假設你在交換之後釋放objectArray。 – Vikings 2012-03-17 02:50:12

+0

@ derek.lo我認爲它可以保留財產。 – Vignesh 2012-03-17 03:48:39

0

您不必使用NSKeyedArchiver archivedDataWithRootObject:。你可以簡單地傳入數組。另外,setObject保留該項目,因此您應該release您的objectArray結束。

+0

我正在使用自定義對象,因此需要在輸入默認值時進行編碼,並在加載時取消存檔。好的,謝謝你的提示! – Apollo 2012-03-17 02:41:51