如何修复保留计数为+1的泄漏对象?

时间:2012-05-20 13:13:13

标签: iphone objective-c ios retaincount

我在以下代码中有一个泄漏的对象。我如何解决它?我尝试添加[apiViewController发布];但是当我分析应用程序时,我仍然得到:

enter image description here

 if (idx == 2) {
        NSLog(@"you touched menu 2");

        APICallsViewController *apiViewController = [APICallsViewController alloc];
        [self.navigationController pushViewController:apiViewController animated:YES]; 
        //[apiViewController getFriendsCallAPIDialogFeed];
        [apiViewController getAppUsersFriendsUsing];


    }

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

你忘了-init和-release。

APICallsViewController *apiViewController = [[APICallsViewController alloc] init];
...
[apiViewController release];

您可能需要阅读Objective-C programming

答案 1 :(得分:1)

首先,你需要init,正如hwaxxer和Justin Boo建议的那样。

其次,有几个人建议使用autoreleaseautorelease是延迟release,除非您需要,否则通常不应该这样做(例如,您的方法需要将释放推迟到以后才能将对象返回给调用者)。因此,简而言之,只有在将对象返回给方法的调用者时才使用autorelease,否则使用release。在这种情况下,您应该使用release

在这个特定场景中,它并不重要(因为通过推动视图控制器,它仍然被保留,并且在该视图从堆栈中弹出之前不会被释放),但是如果你打算做自己的内存管理(即不使用ARC),值得采用良好的做法,即release只要你可以(例如在这种情况下),当你将对象返回给方法的调用者时只有autorelease因此必须推迟release

第三,我建议阅读并确保你理解Advanced Memory Management。这为您提供了一些您真正需要理解的内存管理基本规则(例如,如果您创建它,那么您拥有它,并且必须将其释放)。

第四,一旦你掌握了记忆管理的熟练程度(并且只有在你真正理解了正在发生的事情之后才会这样做),我建议认真考虑Transitioning to ARC,因为你没有必要处理大部分这种愚蠢行为。

答案 2 :(得分:0)

对于您分配/保留的每个对象,您负责释放。

[apiViewController getAppUsersFriendsUsing];

把...

[apiViewController release];