为啥 NSMutableArray 元素没有被释放?
Posted
技术标签:
【中文标题】为啥 NSMutableArray 元素没有被释放?【英文标题】:Why NSMutableArray element is not being deallocated?为什么 NSMutableArray 元素没有被释放? 【发布时间】:2012-02-26 13:14:17 【问题描述】:为什么 NSMutableArray 元素在像这样添加时没有被释放:
[map addObject:[[FLItem alloc] init]];
[map release];
它在以下情况下起作用:
FLItem *item = [[FLItem alloc] init];
[map addObject:item];
[item release];
[map release];
这里有什么区别?
附: FLItem的dealloc实现中有NSLog。
【问题讨论】:
【参考方案1】:当您像这样添加项目时:
[map addObject:[[FLItem alloc] init]];
或者像这样:
FLItem *item = [[FLItem alloc] init];
[map addObject:item];
它的保留计数为 2,因为您使用 init 创建它(即 1),NSMutableArray
也保留它(即另一个 1)。
因此,当您释放数组时,它会释放项目并且其保留计数变为 1。因此,在第一种情况下,它不会被释放,而在第二种情况下,您调用 [item release];
它会被释放。
在第一种情况下你可能应该做的是:
[map addObject:[[[FLItem alloc] init] autorelease]];
【讨论】:
谢谢!不知何故,我认为init本身不会增加retainCount,但赋值会增加,但现在很清楚:) Objective C 遵循这样的约定,即如果您使用以 init、copy 或 create 开头的方法获取对象,则您拥有它(保留计数 +1)并且您必须稍后释放它。以上是关于为啥 NSMutableArray 元素没有被释放?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 for 循环会错过它操作的 NSMutableArray 中的第一个元素?