【问题标题】:memory issue when removing an array from NSUserDefaults从 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 错误的根源......

标签: iphone objective-c ios xcode


【解决方案1】:

回答你的问题

使用“removeObjectForKey”是否存在内存问题?

我的答案是否定的。但这一步不是必需的。

[defaults setObject:forKey:]

够了。

【讨论】:

  • 所以 setObject:forkey 实际上会覆盖之前保存在该键下的任何对象?
  • 这个答案是对的,我假设您在进行交换后释放 objectArray。
  • 我不释放 objectArray 因为它是用自动释放初始化的,不是吗? initwithArray 不会自动释放数组吗?
  • @derek.lo。 initWithArray 就像任何其他方法一样。它不做任何内存分配或指向。这里的关键字是'alloc'。当您分配或复制或保留或新的东西时,您就是它的所有者。你必须释放它。
【解决方案2】:

您不必使用NSKeyedArchiver archivedDataWithRootObject:。您可以简单地传入数组。另外,setObject 保留了该项目,所以你应该在最后release 你的objectArray

【讨论】:

  • 我正在使用自定义对象,因此在输入默认值时需要对其进行编码,并在加载时取消存档。好的,谢谢你的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多