从 NSUserDefaults 中删除数组时的内存问题
Posted
技术标签:
【中文标题】从 NSUserDefaults 中删除数组时的内存问题【英文标题】:memory issue when removing an array from NSUserDefaults 【发布时间】:2012-03-17 01:48:37 【问题描述】:我的目标是能够更新 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"];
【问题讨论】:
我认为这是我的 EXC_BAD_ACCESS 错误的根源...... 【参考方案1】:回答你的问题
使用“removeObjectForKey”是否存在内存问题?
我的答案是否定的。但这一步不是必需的。
[defaults setObject:forKey:]
够了。
【讨论】:
所以 setObject:forkey 实际上会覆盖之前保存在该键下的任何对象? 这个答案是对的,我假设您在进行交换后释放 objectArray。 我不释放 objectArray 因为它是用自动释放初始化的,不是吗? initwithArray 不会自动释放数组吗? @derek.lo。 initWithArray 就像任何其他方法一样。它不做任何内存分配或指向。这里的关键字是'alloc'。当您分配或复制或保留或新的东西时,您就是它的所有者。你必须释放它。【参考方案2】:您不必使用NSKeyedArchiver archivedDataWithRootObject:
。您可以简单地传入数组。另外,setObject
保留了该项目,所以你应该在最后release
你的objectArray
。
【讨论】:
我正在使用自定义对象,因此在输入默认值时需要对其进行编码,并在加载时取消存档。好的,谢谢你的提示!以上是关于从 NSUserDefaults 中删除数组时的内存问题的主要内容,如果未能解决你的问题,请参考以下文章
让 tableView 从 NSUserDefaults 中删除滑动删除项目 - 如何将这两个功能结合在一起?
Swift:仅从NSUserDefaults中删除第一个对象
如何删除最后一个字符(从数组创建字符串时的逗号)? [复制]