【问题标题】: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。

【问题讨论】:

    标签: objective-c nsmutablearray release dealloc


    【解决方案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)并且您必须稍后释放它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-07-23
    • 1970-01-01
    • 2021-10-03
    • 2020-07-22
    相关资源
    最近更新 更多