Objective-C内存管理:我何时[发布]?

时间:2010-06-10 06:05:58

标签: objective-c memory-management

我还不熟悉这个内存管理的东西(垃圾收集器处理Java中的所有内容),但据我所知如果为对象分配内存然后你必须在完成对象后立即将该内存释放回计算机。

myObject = [Object alloc];

[myObject release];

现在我的 Objective-C .m文件中只有3个部分: @Interface @Implementation main 即可。我在程序结束时在这些人旁边发布了我的对象:

[pool drain];
return 0;

但是,如果这个程序要复杂得多,那么在程序结束时发布 myObject 是否可以呢?

我想更好的问题是什么时候我会释放一个对象的已分配内存?我如何知道放置[myObject release];的位置?

3 个答案:

答案 0 :(得分:3)

这可能有点过于简化了,但一般来说,你会想要在声明它的地方发布它。

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

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

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

Apple有一些关于内存管理的精彩文档,我会在developer.apple.com查看。

答案 1 :(得分:1)

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

瞬态对象

通常,您应该autorelease瞬态对象。这些是在本地分配的对象,除了调用它们的方法之外不需要存在。或者它们从方法传递到方法。

所有权链

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

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

该计划的生命周期

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

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

答案 2 :(得分:1)

你必须考虑所有权。当您通过调用 alloc new 保留来获取对象的所有权时,您也可以通过调用 release 时,> autorelease 。

一般规则是:

本地变量:在同一方法中释放它。如果要将其返回给调用者,请使用 autorelease

类成员:在 dealloc 方法中发布