0

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

在此处输入图像描述

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

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


    }

谢谢你的帮助

4

3 回答 3

3

您忘记了-init 和-release。

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

您可能需要阅读Objective-C 编程

于 2012-05-20T13:17:57.667 回答
1

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

其次,有几个人建议使用autorelease. 这autorelease是一个 deferred release,除非您需要,否则您通常不应该这样做(例如,您的方法需要将发布推迟到以后,以便它可以将对象返回给它的调用者)。因此,简而言之,仅autorelease在将对象返回给方法的调用者时使用,否则使用release. 在这种情况下,您应该使用release.

在这种特殊情况下,这并不重要(因为通过推送视图控制器,它无论如何都会被保留,并且在该视图从堆栈中弹出之前不会被释放),但是如果您要进行自己的内存管理(即不使用 ARC),值得采用良好实践,即release只要可以(例如在这种情况下)并且仅autorelease当您将对象返回给方法的调用者并因此必须推迟release.

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

第四,一旦你精通内存管理(并且只有在你这样做之后,因为它对真正了解正在发生的事情很有用),我建议认真考虑过渡到 ARC,因为你不必处理很多这样的事情愚蠢。

于 2012-05-20T14:26:58.650 回答
0

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

[apiViewController getAppUsersFriendsUsing];

放...

[apiViewController release];
于 2012-05-20T13:15:42.770 回答