2011-10-09 42 views
1

我很困惑在這種情況下的內存管理。 在我的應用程序中,用戶在UITextField tf內進行週期性輸入,並且類型化字符串(NSString *)通過addObject存儲爲MSMutableArray * arr的元素。存儲的集合顯示在UITableView中。我的應用可以進入bkgr,並定期通過推送通知喚醒。據我瞭解,存儲在arr中的數據可能會丟失,而我的應用程序是非活動的,爲了保存它,我需要進行存檔/恢復。 我的存檔/恢復使用iphone應用程序內存管理保存/恢復

NSUserDefaults*prefs; 
[prefs setObjectForKey:x forKey:key] 

歸檔和

[prefs objectForKey:key] 

恢復ARR的每一個項目。

問題1:我認爲要防止內存泄漏我需要做[arr release] 我是否還需要對每個已添加到arr的對象執行釋放操作,或者因爲我沒有爲其分配NSString那麼,它會自動完成嗎?問題2:在恢復中,我從類似arr = [[NSMutableArray alloc] initWithObjects:nil]開始;然後才能讀取並將已歸檔的項目添加回arr。我認爲[prefs objectForKey:key]會在我離開它所在的範圍時被釋放 - 因此我需要像retain這樣的東西來保存它在arr中。由於另一個應用程序深度睡眠,此架構是否會在下一個歸檔/恢復週期中運行? 是否有一個更清晰的方法來實現相同? 謝謝。 Victor

+0

很高興看到更多的代碼示例在問題中。理解上下文有點混淆。 –

回答

2

將對象添加到NSArray會導致NSArray保留每個對象。

所以你在哪裏實例化對象,然後將它們添加到一個數組的情況下,並不需要這些對象進一步保留:

// saving strings inside an array, then array to the NSUserDefaults 
NSString *string1 = @"My String 1"; 
NSString *string2 = @"My String 1"; 
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:10]; 
[arr addObject:string1]; 
[arr addObject:string2]; 

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];; 
[prefs setObject:arr forKey:@"MyArray"]; 

[arr release]; 

然後將整個陣列從首選項恢復:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSArray *array = [prefs objectForKey:@"MyArray"]; 

或者,節省下的單獨的密鑰字符串,它會是這樣的:

[prefs setObject:[arr objectAtIndex:0] forKey:@"MyFirstStringKey"]; 
[prefs setObject:[arr objectAtIndex:1] forKey:@"MySecondStringKey"]; 

對於恢復,你也只需添加項目到數組也沒有保留要求:

// assuming this time several keys added to an array 
// also note using autoreleased version of array - much easier 
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:10]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];; 
[arr addObject:[prefs objectForKey:@"MyFirstStringKey"]]; 
[arr addObject:[prefs objectForKey:@"MySecondStringKey"]]; 

// then assign arr or use it otherwise 

也更容易仍是使用非可變數組和你想要的對象列表實例化數組在陣列上:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];; 
NSArray *arr = [NSArray arrayWithObjects:[prefs objectForKey:@"MyFirstStringKey"], [prefs objectForKey:@"MySecondStringKey"], nil]; 
+0

'NSString' * *可以保存到'NSUserDefaults'。任何物體都可以。只是不是像int/float/char/bool /等基本類型,這就是爲什麼這些需要包裝在「NSNumber」。 OP,確保在設置/修改一個值後[[NSUserDefaults standardUserDefaults] synchronize]]。 – chown

+0

對不起沒有更清楚的了 - 我的意思是一個對象的數組是否都可以存儲在NSUserDefaults下的一個單一的鍵下(參見上面的設置key @「MyArray」的數組)。我意識到像單個字符串這樣的單個對象可以保存在單個鍵下。 –

+0

啊,我誤解了:)。在那種情況下,林肯定你可以有一個數組與1只關鍵。NSArray/NSMutableArray都只允許對象作爲值,所以不應該存在將數組作爲單個值存儲的問題。我不得不嘗試一下,因爲我也不是100%肯定。 – chown