【问题标题】:How do I fix a leaked object with a retain count of +1?如何修复保留计数为 +1 的泄漏对象?
【发布时间】:2012-05-20 13:13:13
【问题描述】:

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

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

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


    }

感谢您的帮助

【问题讨论】:

  • 你不知道自己在做什么。找一本关于 iOS 堆管理的好参考书,好好研究一下。
  • Advanced Memory Management 涵盖了其中一些内容。

标签: iphone objective-c ios retaincount


【解决方案1】:

您忘记了 -init 和 -release。

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

您可能需要阅读Objective-C programming

【讨论】:

    【解决方案2】:

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

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

    在这种特殊情况下,这无关紧要(因为通过推送视图控制器,它无论如何都会被保留,并且在该视图从堆栈中弹出之前不会被释放),但如果你打算做你的自己的内存管理(即不使用 ARC),值得采用良好的做法,即尽可能使用release(例如在这种情况下),并且只有在将对象返回给方法的调用者时才使用autorelease,因此必须推迟release

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

    第四,一旦你熟练掌握了内存管理(并且只有在你熟练之后,因为它对真正了解正在发生的事情很有用),我建议认真考虑Transitioning to ARC,因为你不必处理很多这种愚蠢。

    【讨论】:

      【解决方案3】:

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

      之后

      [apiViewController getAppUsersFriendsUsing];
      

      放...

      [apiViewController release];
      

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2012-06-13
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多