为啥 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 中的第一个元素?

为啥函数执行后没有释放堆上的元素?

为啥我的自动释放对象没有被释放?

为啥这个 ImageView 没有被释放?

为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?

为啥我delete后内存没有被释放?