【发布时间】:2011-02-22 11:45:28
【问题描述】:
有时我看到开发人员使用:
ClassA *obj = [[ClassA alloc]...]autorelease];
为什么有时会自动释放对象而有时不会? 或者这是一个错误?
【问题讨论】:
标签: iphone objective-c memory-management
有时我看到开发人员使用:
ClassA *obj = [[ClassA alloc]...]autorelease];
为什么有时会自动释放对象而有时不会? 或者这是一个错误?
【问题讨论】:
标签: iphone objective-c memory-management
自动发布只是意味着“这将在以后发布”。如果你自动释放某个东西 3 次,它会在以后释放 3 次。
在做任何其他事情之前,不要猜测,而是通读并理解the Memory Management Programming Guide。这将为您节省大量时间和挫败感。
在 cmets 的另一个答案中,您还问,为什么人们一开始就使用 autorelease。对于必须创建新对象并返回它的常见情况,自动释放是必需的。根据内存管理的其他规则,你需要在某个时候释放对象,否则它会泄漏,但如果你在返回之前释放它,它会立即消失。
有两种方法可以解决这个问题:a) 让这些方法返回一个新对象,调用者在处理完该对象后会释放该对象;b) 确保该对象已被释放一旦调用者完成它。
Cocoa 和 Cocoa Touch 按照惯例处理这种情况的方式是选项 b):使用自动释放池,因为除了显式创建的对象之外,您不必跟踪所有权。有些人几乎在所有事情上都使用 autorelease 而不是 release,这比 release 效率低一点,但更重要的是,它隐藏了您在尝试阅读、导航和理解代码时可能在 release 和 autorelease 之间做出的任何有用区别。
正如我之前所说,请阅读内存管理编程指南,所有这些问题都会得到解答。更好的是,如果您只遵循其中列出的简单规则,您就不必对每种组合进行深入思考;对于您的情况,将有一个一般规则要遵循,并且该规则将起作用。
【讨论】:
自动释放没有错误 - 它只是将对象设置为稍后自动释放,您不一定可以控制。
我尝试始终显式释放我的对象,除非我没有选择,例如从方法返回新分配/初始化的对象时。
【讨论】:
[object release] 并不是使用自动释放的理由。 xcode 中的分析工具也应该可以帮助你找出你不小心漏掉的那些。
其实当你使用如下语句创建对象时,
ClassA *obj = [[ClassA alloc]init ...];
然后您需要释放该对象,否则它将保留在该应用程序中并且对任何其他对象都没有用。那么内存就会被浪费掉。
所以我们要通过[obj release]来释放对象;
以防我们无法在特定时间发布。所以我们会放自动释放。如果我们这样做,那么 NSAutoReleasePool 会处理释放操作。
我们可以使用上述任何一种。
感谢,
萨提亚。
【讨论】:
不,这根本不是错误。自动释放意味着对象将在当前自动释放池结束时被释放。
查看您的 main.m 类文件(每个 Cocoa/Cocoa Touch 项目都得到它)。你会看到它有一个看起来有点像这样的方法:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
UIApplicationMain(.....);
[pool release];
UIApplicationMain 启动应用程序的运行循环。当您到达终点时,(应用程序已关闭)自动释放池中的任何内容都将被转储。
现在,如果您实现多线程并在池中创建自己的自动释放池,那么当 池被释放时,您将释放对象。
【讨论】: