【问题标题】:Objective-C Memory Management: When do I [release]?Objective-C 内存管理:我什么时候[发布]?
【发布时间】:2010-06-10 06:05:58
【问题描述】:

我对这个内存管理的东西还是新手(垃圾收集器处理了 Java 中的所有事情),但据我了解 如果你为一个对象分配内存那么您必须在完成对象后立即将内存释放回到计算机。

myObject = [Object alloc];

[myObject release];

现在我的 Objective-C .m 文件中只有 3 个部分:@Interface@Implementationma​​in 。我在这些家伙旁边的程序结束时释放了我的对象:

[pool drain];
return 0;

但是如果这个程序要复杂得多,在程序结束时释放 myObject 会好吗?

我想一个更好的问题是我什么时候释放一个对象的分配内存?我怎么知道在哪里放置[myObject release];

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    这可能有点过于简单了,但一般来说,您会希望在您声明它的地方发布它。

    如果您在特定方法调用中声明一个对象,那么根据定义,您将在该方法调用结束时处理该对象(或至少该对象的句柄)...然后释放它。

    如果您将一个对象声明为实例变量,那么根据定义,当该实例被销毁时您将完成它...在该类的 dealloc 方法中释放它。

    请记住,“释放”不等于“销毁”。在您的应用程序中传递对象时,将多个句柄存储在不同的位置可能是有意义的......在这种情况下,“释放”意味着“我已经完成了这个对象,但其他人可能仍然使用它。”只有当“句柄”(保留计数)的数量达到零时才会发生重新分配。

    Apple 有一些很棒的内存管理文档,我会在 developer.apple.com 上查看。

    【讨论】:

      【解决方案2】:

      您基本上拥有三种对象,每种对象都有不同的模式。

      瞬态对象

      一般来说,您应该autorelease 瞬态对象。这些是在本地分配的对象,不需要存在于调用它们的方法之外。或者它们在方法之间传递。

      所有权链

      当一个对象作为实例字段存在于另一个对象中时,当“所有者”(或“父”)对象不存在时,您应该release“拥有”(或“子”)对象。这是在父对象的dealloc 方法中完成的:

      - (void) dealloc {
          [child release]; // child was declared as an instance variable
          [super dealloc];
      }
      

      程序的生命周期

      当一个对象打算在程序的生命周期内存在时,通常根本不需要调用release,除非需要进行某种资源清理。你可以把它放在applicationWillTerminate:,你可以在Apple的文档中查找。

      (您可能应该避免使用此类对象,但这是另一个问题的讨论。)

      【讨论】:

      • 请注意,applicationWillTerminate: 在 iOS 4 中大部分时间都不会被调用。
      • 好电话。无论如何,这不是我通常需要的方法。
      【解决方案3】:

      您必须考虑所有权。当您通过调用 allocnewretain 获得对象的所有权时,您还需要通过调用 来释放它>autorelease 当您将拥有的对象返回给调用者时,或通过调用 release

      一般规则是:

      局部变量:在同一个方法中释放。当您想将其返回给调用者时,请使用 autorelease

      类成员:在dealloc方法中释放它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多