2012-04-27 73 views
0

我在调用NSMutableArray上的removeObjectAtIndex时发生异常,并且说myLocationsArray被声明为不可变,从而导致应用程序抛出异常。该阵列上的所有其他操作都很好,最明确的声明是正确的,等等,但在我的应用程序中,它被设置为不可变的。在removeObjectAtIndex呼叫前右将NSMutableArray重新初始化为NSMutableArray

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

:调查的试图找到在哪里获得设置不变一段时间后,我决定拧紧,只是重新声明变量本身。

但是我知道这是坏的,我在相同的变量上调用alloc/init两次。但它是唯一有效的工作。有没有什么办法提醒这个变量,它是一个NSMutableArray,而不像我这样引入内存泄漏?

+1

您需要显示一些代码,与阵列涉及并可能导致这一点,否则任何人都很难提供适当的建议。 – 2012-04-27 16:07:49

回答

1

NSUserDefaults返回数组的不可变副本。无论你把NSArray还是NSMutableArray都放在里面,它总是给你不可变的拷贝。

那么,这样做是为了得到一个可变的副本,您可以用

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

或者就是这样工作

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

我终于意识到问题是NSUserDefaults返回不可变的NSArrays,但我重新声明他们NSMutableArrays来解决它,没有意识到我可以告诉它给我一个可变的副本:-D – jamzsabb 2012-04-28 16:58:40

0

该声明不应该;你的错误是一个运行时错误。这听起来像你的myLocationsArray变量已经被分配了一个不可变数组(NSArray),不管它是在某个地方被重新分配,还是总是不可变的,都不可能从你的代码片段中说出来。

1

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

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

1

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

不出所料,您不能通过改变您(认为您)存储在其中的内容来更改存储在NSUserDefaults中的内容。只能通过重新存储某些内容来替换之前存储的内容,从而更改所存储的内容。

+0

是的,它原来是NSUserDefaults。我确定在将NSUserDefaults中的数据blob分配给它之前声明我的NSMutableArray,并修复它并允许随意更改。谢谢! – jamzsabb 2012-04-28 16:12:21