将NSMutableArray重新初始化为NSMutableArray

时间:2012-04-27 16:01:27

标签: objective-c ios

我的应用程序在NSMutableArray上调用removeObjectAtIndex时抛出异常,说myLocationsArray被声明为不可变,我遇到了问题。该阵列上的所有其他操作都很好,它最明确地声明正确等等,但在我的应用程序的某个地方,它被设置为不可变的。经过一段时间的调查,试图找到它设置为不可变的地方,我决定搞砸它,然后重新声明变量:

myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults
objectForKey:MYLOCATIONSARRAY_KEY]];

在removeObjectAtIndex调用之前。

但是我知道这必须是错误的,我在同一个变量上调用了两次alloc / init。然而,这是唯一有效的方法。有没有办法提醒这个变量它是一个NSMutableArray而不引入像我这样的内存泄漏?

4 个答案:

答案 0 :(得分:1)

我建议在程序抛出异常的行(包含removeObjectAtIndex的行)上设置断点,并使用调试器检查数组的实际类型。如果您将鼠标移到数组名称上,将显示一个弹出菜单,为您提供有关指向对象的所有信息。

我期望你发现这个对象是一个NSArray(对抗NSMutableArray),然后追溯到你初始化它的那一点。

答案 1 :(得分:1)

看起来你正在使用NSUserDefaults。从NSUserDefaults中获取的所有对象始终是不可变的,无论您存储在其中的是什么。 NSUserDefaults不会保留对您设置的特定对象的引用,它会保留数据。它正在有效地制作副本。当你从NSUserDefaults中获得某些东西时,它会从它存储的数据中创建一个新的(不可变的)对象并将其提供给你。

不出所料,你不能改变存储在NSUserDefaults中的内容,改变你认为存储在你身上的东西。您只能通过重新存储内容来替换之前存储的内容来更改存储的内容。

答案 2 :(得分:1)

NSUserDefaults返回数组的不可变副本。无论您将NSArray还是NSMutableArray放入其中都无关紧要,它始终会为您提供不可变的副本。

所以,这样做是为了获得一个可以使用的可变副本

myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]];

或只是这个

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy];

答案 3 :(得分:0)

声明无关紧要;您的错误是运行时错误。听起来你的myLocationsArray变量已经被分配了一个不可变数组(NSArray),虽然它是在某处重新分配还是总是不可变的,但是你的代码片段是不可能的。