目标C:非虚拟实例方法中的内存泄漏

时间:2011-07-03 03:30:47

标签: objective-c ios memory-leaks

我在非void实例方法中遇到另一个内存泄漏,该方法返回类NSMutableArray的对象。

enter image description here

有人可以告诉我如何解决这个漏洞吗?我试图在方法结束时释放'userFollowings',但它仍然报告泄漏。

4 个答案:

答案 0 :(得分:9)

当您要从已初始化或保留它的方法返回一个对象时,通常的做法是将其返回自动释放。这样,接收对象的用户不必担心释放它。因此,您的最后一行代码应如下所示:

return [userFollowing autorelease];

Memory Management Programming Guide读一点内容管理规则可能不会有什么坏处,而且网上和本网站上还有很多其他有用的资源。

答案 1 :(得分:3)

Cocoa程序使用a set of conventions使得内存管理更不容易出错。当一个方法返回一个对象时,调用它的代码需要知道它是否拥有它。

它归结为如果你正在编写一个返回一个对象的方法,并且该方法不会通过命名为newalloc之类的方式来传达调用者的所有权, copy等,在您返回之前,您需要autorelease

您收到的消息是什么 - "对象作为拥有参考返回给来电者" 表示您已经转发所有权调用代码。问题是您的方法名称另有说明。

如果我打电话给你的方法并且需要挂在物体上,我会在上面拨打retain以便我拥有它。我需要这样做,因为你的方法名称暗示我不是主人。只要您返回一个自动释放的对象,这是正确的。但是如果你不自动释放该对象,它最终会有一个保留计数为2 - 一旦你分配它,一次保留它。当我最终发布它时,它的保留计数仍为1,并且永远不会从内存中释放,导致内存泄漏。

答案 2 :(得分:2)

问题是userFollowings永远不会被释放。尝试以

结尾
return [userFollowings autorelease];

答案 3 :(得分:1)

试试这个:

   NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]