2009-04-28 64 views
2

this question我已经修复了一堆内存泄漏的Clang的“返回对象泄漏”是什么意思?

,我已经修复所有明显的内存泄漏BEncoding.m(最初从here),但锵发现四“返回对象的泄漏”的错误,这是我“M不知道如何进行排序:

完整消息/代码的相应位分别是:

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]对象返回给呼叫者作为所属参考(单保留计数传送到呼叫者)

回答

3

OK,所以扩大上述答案(感谢设置我在正确的轨道上)...

return [data autorelease] 

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

甜。我想我只是在Obj-C内存管理中赢得了我的绿带。

7

你想要的:

return [data autorelease];

因为你将它交给调用者。

+0

+1。请扩大你的答案。这是一个非常阴暗和令人困惑的话题,而这个知识的小面包屑几乎让我明白了这一点 – 2012-06-24 04:19:06