有时我看到开发人员使用:
ClassA *obj = [[ClassA alloc]...]autorelease];
为什么这有时会自动释放对象而有时却不会自动释放对象?还是这是一个错误?
[自动发布只是指“将在以后发布”。如果您将某物自动释放三遍,它将在以后被释放三遍。
而不是猜测,在执行其他任何操作之前,请通读并理解the Memory Management Programming Guide。这将为您节省大量的时间和挫败感。
您在另一个答案的注释中还询问了为什么人们开始使用自动发布。在通常情况下,必须创建新对象并返回它,自动释放是必需的。根据内存管理的其他规则,您可能需要在某个时候释放该对象,否则该对象将被泄漏,但是如果在返回之前释放它,它将立即消失。
有两种处理方法:a)使这些方法返回一个新对象,调用者在完成对对象的处理后应释放该对象; b)确保该对象按以下方式释放:调用者完成操作后立即进行。
Cocoa和Cocoa Touch按照约定处理这种情况的方式是选项b):使用自动释放池,因为除了明确创建的对象之外,您不必跟踪所有权。有些人几乎将自动释放用于发布而不是释放,这比释放要低一些,但是更重要的是,它隐藏了当您尝试阅读,浏览和理解代码时可能在释放和自动释放之间做出的有用区分。
正如我之前所说,请阅读《内存管理编程指南》,所有这些问题都将得到解答。更好的是,如果您仅遵循其中列出的简单规则,就不必对每种组合都深入思考。对于您的情况,将遵循一条通用规则,该规则将起作用。
自动释放没有错误-它只是将对象设置为在以后自动释放,而您不必对此进行控制。
我会尝试始终显式释放我的对象,除非我没有选择,例如从方法返回新分配/初始化的对象时。
实际上是在使用以下语句创建对象时,
ClassA * obj = [[ClassA alloc] init ...];
然后,您需要释放该对象,否则它将保留在该应用程序中,并且对任何其他对象都没有用。然后,内存将被浪费。
所以我们必须通过[obj release]释放对象;
如果有一段时间我们无法在特定时间发布。因此,我们将自动发布。如果我们这样做,则NSAutoReleasePool会处理释放操作。
我们可以使用以上任何一种。
Reagrds,
Satya。
不,这根本不是错误。自动释放意味着该对象将在当前自动释放池的末尾释放。
查看您的main.m
类文件(每个Cocoa / Cocoa Touch项目都会得到它)。您将看到它的方法看起来像这样:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
UIApplicationMain(.....);
[pool release];
UIApplicationMain
启动您的应用程序的运行循环。到达末尾时,(应用程序已关闭)自动释放池中的所有内容都将转储。
现在,如果您隐含多线程并在池中创建自己的自动释放池,则在释放that池时将释放对象。