【问题标题】:When is manual memory management necessary on the iPhone?什么时候需要在 iPhone 上进行手动内存管理?
【发布时间】:2011-02-22 11:45:28
【问题描述】:

有时我看到开发人员使用:

ClassA *obj = [[ClassA alloc]...]autorelease];

为什么有时会自动释放对象而有时不会? 或者这是一个错误?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    自动发布只是意味着“这将在以后发布”。如果你自动释放某个东西 3 次,它会在以后释放 3 次。

    在做任何其他事情之前,不要猜测,而是通读并理解the Memory Management Programming Guide。这将为您节省大量时间和挫败感。


    在 cmets 的另一个答案中,您还问,为什么人们一开始就使用 autorelease。对于必须创建新对象并返回它的常见情况,自动释放是必需的。根据内存管理的其他规则,你需要在某个时候释放对象,否则它会泄漏,但如果你在返回之前释放它,它会立即消失。

    有两种方法可以解决这个问题:a) 让这些方法返回一个新对象,调用者在处理完该对象后会释放该对象;b) 确保该对象已被释放一旦调用者完成它。

    Cocoa 和 Cocoa Touch 按照惯例处理这种情况的方式是选项 b):使用自动释放池,因为除了显式创建的对象之外,您不必跟踪所有权。有些人几乎在所有事情上都使用 autorelease 而不是 release,这比 release 效率低一点,但更重要的是,它隐藏了您在尝试阅读、导航和理解代码时可能在 release 和 autorelease 之间做出的任何有用区别。

    正如我之前所说,请阅读内存管理编程指南,所有这些问题都会得到解答。更好的是,如果您只遵循其中列出的简单规则,您就不必对每种组合进行深入思考;对于您的情况,将有一个一般规则要遵循,并且该规则将起作用。

    【讨论】:

      【解决方案2】:

      自动释放没有错误 - 它只是将对象设置为稍后自动释放,您不一定可以控制。

      我尝试始终显式释放我的对象,除非我没有选择,例如从方法返回新分配/初始化的对象时。

      【讨论】:

      • 而且我总是自动释放,除非我别无选择。我忘记了 [foo 版本];在方法结束时过于频繁。
      • 只是为了澄清我的答案-除非我别无选择,否则我总是释放(而不是自动释放)。在我看来,忘记[object release] 并不是使用自动释放的理由。 xcode 中的分析工具也应该可以帮助你找出你不小心漏掉的那些。
      【解决方案3】:

      其实当你使用如下语句创建对象时,

      ClassA *obj = [[ClassA alloc]init ...];

      然后您需要释放该对象,否则它将保留在该应用程序中并且对任何其他对象都没有用。那么内存就会被浪费掉。

      所以我们要通过[obj release]来释放对象;

      以防我们无法在特定时间发布。所以我们会放自动释放。如果我们这样做,那么 NSAutoReleasePool 会处理释放操作。

      我们可以使用上述任何一种。

      感谢,

      萨提亚。

      【讨论】:

        【解决方案4】:

        不,这根本不是错误。自动释放意味着对象将在当前自动释放池结束时被释放。

        查看您的 main.m 类文件(每个 Cocoa/Cocoa Touch 项目都得到它)。你会看到它有一个看起来有点像这样的方法:

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        UIApplicationMain(.....);
        [pool release];

        UIApplicationMain 启动应用程序的运行循环。当您到达终点时,(应用程序已关闭)自动释放池中的任何内容都将被转储。

        现在,如果您实现多线程并在池中创建自己的自动释放池,那么当 池被释放时,您将释放对象。

        该方法的文档在这里:http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/autorelease

        【讨论】:

        • 感谢您的回答。但我的问题是:为什么要自动释放一个我是 ownerchip 的对象,我负责释放它。在我的例子中: ClassA *obj = [ClassA alloc]... [obj release],为什么我们放 autorelease ?像这样 ClassA *obj = [ClassA allo]...autorelease]; .我是对象的所有者,我负责发布它,但有时开发人员会自动发布,为什么?谢谢
        • 开发人员使用它是因为它很简单。时期。这并不比显式发布好,但也不是坏事。你只需要准备好处理内存开销。
        • 我认为@Ian L 的回答会让您知道原因。
        猜你喜欢
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多