0

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

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

在 removeObjectAtIndex 调用之前。

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

4

4 回答 4

1

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

我期望你通过这种方式发现对象是一个 NSArray(与 NSMutableArray),然后追溯到你最初初始化它的地方。

于 2012-04-27T16:10:11.910 回答
1

看起来你正在使用NSUserDefaults. 您从中取出的所有对象NSUserDefaults始终是不可变的,无论您在其中存储了什么。NSUserDefaults不会保留对您设置的特定对象的引用,它会保留data。它实际上是在制作副本。当您NSUserDefaults从 .

毫不奇怪,您无法NSUserDefaults通过改变您(认为您)存储在其中的内容来更改存储的内容。您只能通过重新存储某些内容来替换以前存储的内容来更改存储的内容。

于 2012-04-27T23:29:21.043 回答
1

NSUserDefaults返回数组的不可变副本。不管你是放NSArray还是NSMutableArray在里面,它总是给你不可变的副本。

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

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

或者只是这个

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy];
于 2012-04-27T23:35:15.413 回答
0

声明应该无关紧要;您的错误是运行时错误。听起来您的myLocationsArray变量已被分配了一个不可变数组(NSArray),尽管从您的代码片段中无法判断它是在某处重新分配还是始终是不可变的。

于 2012-04-27T16:08:23.423 回答