从 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 中删除数组时的内存问题的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDictionary 中删除密钥

让 tableView 从 NSUserDefaults 中删除滑动删除项目 - 如何将这两个功能结合在一起?

Swift:仅从NSUserDefaults中删除第一个对象

如何删除最后一个字符(从数组创建字符串时的逗号)? [复制]

使用 KVO 和延迟选择器观察 NSUserDefaults 时的 iOS exc_bad_access

无法从 NSUserDefaults 检索数据到今天的扩展(Swift)