首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将NSMutableArray重新初始化为NSMutableArray

将NSMutableArray重新初始化为NSMutableArray
EN

Stack Overflow用户
提问于 2012-04-28 00:01:27
回答 4查看 237关注 0票数 0

当我在NSMutableArray上调用removeObjectAtIndex时,我的应用程序抛出了一个异常,说myLocationsArray被声明为不可变的。在该数组上的所有其他操作都很好,它被明确地声明为正确等等,但在我的应用程序中,它被设置为不可变的。在调查了一段时间后,试图找出它在哪里被设置为不可变的,我决定不去管它,只是重新声明了变量:

代码语言:javascript
运行
复制
myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults
objectForKey:MYLOCATIONSARRAY_KEY]];

就在removeObjectAtIndex调用之前。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-28 07:35:15

NSUserDefaults返回数组的不可变副本。不管你放的是NSArray还是NSMutableArray,它总是会给你一个不可变的副本。

因此,这样做可以获得一个可以使用的可变副本

代码语言:javascript
运行
复制
myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]];

或者就是这样

代码语言:javascript
运行
复制
myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy];
票数 1
EN

Stack Overflow用户

发布于 2012-04-28 00:10:12

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

我期望通过这种方式发现对象是一个NSArray (而不是NSMutableArray),然后回溯到最初初始化它的位置。

票数 1
EN

Stack Overflow用户

发布于 2012-04-28 07:29:21

看起来你在和NSUserDefaults合作。从NSUserDefaults中获得的所有对象都是不可变的,无论您在其中存储了什么内容。NSUserDefaults不会保留对您设置的特定对象的引用,它会保留数据。它实际上是在复制。当你从NSUserDefaults中得到一些东西时,它会从它存储的数据中创建一个新的(不可变的)对象,并将其提供给你。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10353989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档