保存/恢复中的iphone app内存管理

时间:2011-10-09 23:34:43

标签: objective-c ios cocoa-touch memory-management

我对此场景中的内存管理感到困惑。 在我的app中,用户在UITextField tf中定期输入,并且类型化的字符串(NSString *)通过addObject存储为MSMutableArray * arr的元素。存储的集合显示在UITableView中。我的应用程序可以进入bkgr并定期通过推送通知唤醒。据我了解,存储在arr中的数据可能在我的应用程序处于非活动状态时丢失,为了保留它,我需要进行存档/恢复。 我的存档/恢复正在使用

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

归档和

[prefs objectForKey:key]

恢复arr的每一项。

问题1:我认为为了防止内存泄漏我需要做[arr release] 我是否还需要对我添加到arr的每个对象进行一次发布,或者由于我没有为tf分配NSString,它会自动为我完成吗?

问题2:在恢复中,我从像arr = [[NSMutableArray alloc] initWithObjects:nil]之类的东西开始;之前我可以阅读并将已归档的项目添加回arr。我认为[prefs objectForKey:key]会在我离开读取范围时立即释放 - 因此我需要像retain这样的东西来保存它。由于另一个应用程序深度睡眠,此架构是否会在下一个存档/恢复周期中工作? 是否有更清洁的方法来实现同样的目标? 谢谢。 维克多

1 个答案:

答案 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];

然后从prefs恢复整个数组:

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];