【问题标题】:NSCopying and Objective-C memory managementNSCopying 和 Objective-C 内存管理
【发布时间】:2012-11-05 15:29:58
【问题描述】:

Apple 的 NSCopying docs 声明 copyWithZone: 返回一个由发件人隐式保留的对象。因此,当将该对象添加到 NSMutableArray 时,似乎应该向该对象发送一条 autorelease 消息以保持保留计数平衡(因为数组将保留该对象)。

因此,要将一个数组的内容深度复制到另一个数组,我希望是这样的:

NSMutableArray *destination = [NSMutableArray array];

// assume MyObject adopts NSCopying
for (MyObject *obj in myArray) 
    [destination addObject:[[obj copy] autorelease]];

但是我注意到this answer 中的不同方法。 [ret addObject:[val copy]] 似乎是内存泄漏。但是我是 NSCopying 的新手,所以我想我会问:将复制的对象添加到数组时,是否应该向对象发送自动释放消息以保持保留计数平衡? p>

编辑 - 更多信息:Clang 报告删除自动释放后潜在的内存泄漏。也许链接的答案假定copy 返回一个由发件人隐式保留的对象。

【问题讨论】:

    标签: objective-c memory-management autorelease nscopying


    【解决方案1】:

    是的,它确实需要发布,但我不会在这样的循环中使用autorelease,每次迭代都手动执行

       for (MyObject *obj in myArray)
        {
            MyObject *copy = [obj copy];
            [destination addObject:copy];
            [copy release];
        }
    

    【讨论】:

    • 好吧,这是有道理的。使用autorelease 不正确吗?还是只会对性能造成影响?
    • 无论如何,副本都会被阵列保留,因此在这种情况下,性能方面并没有太大的不同。但在可能的情况下显式释放是一个好习惯,尤其是在紧凑的循环中 - 代码也更简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多