gpt4 book ai didi

objective-c - 保存/恢复中的 iphone 应用程序内存管理

转载 作者:行者123 更新时间:2023-11-29 11:20:02 27 4
gpt4 key购买 nike

我对这种情况下的内存管理感到困惑。在我的应用程序中,用户在 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 这样的东西来将它保留在 arr 中。由于另一个应用程序深度 sleep ,此架构是否会在下一个存档/恢复周期中工作?有没有更清洁的方法来实现同样的目标?谢谢。维克多

最佳答案

将对象添加到 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];

关于objective-c - 保存/恢复中的 iphone 应用程序内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com