来自Clang的“返回物体泄漏”是什么意思?

时间:2009-04-28 17:04:07

标签: objective-c memory-leaks clang

this question后,我在BEncoding.m修复了一堆内存泄漏(最初来自here

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

你想要:

返回[data autorelease];

因为你要把它交给来电者。

答案 1 :(得分:3)

好的,所以要扩展上面的答案(感谢我把我设置在正确的轨道上)......

return [data autorelease]

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

甜。我想我刚刚在Obj-C内存管理方面赢得了绿带。

答案 2 :(得分:1)

听起来这些物品在返回之前没有正确释放,这违反了Objective-C memory management conventions