当我在NSMutableArray上调用removeObjectAtIndex时,我的应用程序抛出了一个异常,说myLocationsArray被声明为不可变的。在该数组上的所有其他操作都很好,它被明确地声明为正确等等,但在我的应用程序中,它被设置为不可变的。在调查了一段时间后,试图找出它在哪里被设置为不可变的,我决定不去管它,只是重新声明了变量:
myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults
objectForKey:MYLOCATIONSARRAY_KEY]];就在removeObjectAtIndex调用之前。
然而,我知道这肯定是大错特错,我在同一个变量上调用了alloc/init两次。然而,这是唯一有效的方法。有没有办法提醒这个变量它是一个NSMutableArray,而不像我那样引入内存泄漏?
发布于 2012-04-28 07:35:15
NSUserDefaults返回数组的不可变副本。不管你放的是NSArray还是NSMutableArray,它总是会给你一个不可变的副本。
因此,这样做可以获得一个可以使用的可变副本
myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]];或者就是这样
myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy];发布于 2012-04-28 00:10:12
我建议在程序抛出异常的行上设置断点(包含removeObjectAtIndex的断点),并使用调试器检查数组的真实类型。如果您将鼠标放在数组名称上,将显示一个弹出式菜单,为您提供所需的有关所指向对象的所有信息。
我期望通过这种方式发现对象是一个NSArray (而不是NSMutableArray),然后回溯到最初初始化它的位置。
发布于 2012-04-28 07:29:21
看起来你在和NSUserDefaults合作。从NSUserDefaults中获得的所有对象都是不可变的,无论您在其中存储了什么内容。NSUserDefaults不会保留对您设置的特定对象的引用,它会保留数据。它实际上是在复制。当你从NSUserDefaults中得到一些东西时,它会从它存储的数据中创建一个新的(不可变的)对象,并将其提供给你。
毫不奇怪,您不能通过改变您(自认为)存储在NSUserDefaults中的内容来更改其中存储的内容。您只能通过重新存储某些内容来替换以前存储的内容,从而更改已存储的内容。
https://stackoverflow.com/questions/10353989
复制相似问题