【问题标题】:What does "Leak of returned object" mean, from Clang?来自 Clang 的“返回对象泄漏”是什么意思?
【发布时间】:2009-04-28 17:04:07
【问题描述】:

this question 之外,我已经修复了BEncoding.m 中的一堆内存泄漏(最初来自here

我已经修复了所有明显的内存泄漏,但 Clang 发现了四个“返回对象泄漏”错误,我不确定如何排序:

完整的消息/适当的代码位是:

NSMutableData *data = [[NSMutableData alloc] init];

[1] 方法返回一个具有 +1 保留计数(拥有引用)的 Objective-C 对象

[...]
snprintf(buffer, 32, "%lu:", [object length]);
[data appendBytes:buffer length:strlen(buffer)];
[data appendData:object];
return data;

[3] 对象作为拥有引用返回给调用者(单个保留计数转移给调用者)

【问题讨论】:

    标签: objective-c memory-leaks clang


    【解决方案1】:

    你想要的:

    return [数据自动释放];

    因为您将其交给调用者。

    【讨论】:

    • +1。请扩大你的答案。这是一个非常模糊和令人困惑的话题,这个小小的知识面包屑几乎让我理解了
    【解决方案2】:

    好的,所以扩展上面的答案(感谢您让我走上正轨)...

    return [data autorelease]
    

    您已经分配了一些对象,“数据”,并且即将将该对象返回给调用者。这在 Obj-C 中的工作方式是在调用堆栈的某个级别上,有一个 NSAutoreleasePool。当您向数据发送“自动释放”消息时,它会将自身添加到该自动释放池中。这允许调用者短暂地使用“数据”对象(即,在本地堆栈帧的持续时间内)而无需显式调用“释放”,最终,当自动释放池“弹出”时,数据将被释放(除非有人称之为“保留”)。这很聪明。

    甜。我想我刚刚获得了 Obj-C 内存管理的绿带。

    【讨论】:

      【解决方案3】:

      听起来对象在返回之前没有被正确地自动释放,这违反了Objective-C memory management conventions

      【讨论】:

        猜你喜欢
        • 2017-05-23
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多