何时需要在iPhone上进行手动内存管理?

问题描述 投票:0回答:4

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

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

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

iphone objective-c memory-management
4个回答
4
投票

[自动发布只是指“将在以后发布”。如果您将某物自动释放三遍,它将在以后被释放三遍。

而不是猜测,在执行其他任何操作之前,请通读并理解the Memory Management Programming Guide。这将为您节省大量的时间和挫败感。


您在另一个答案的注释中还询问了为什么人们开始使用自动发布。在通常情况下,必须创建新对象并返回它,自动释放是必需的。根据内存管理的其他规则,您可能需要在某个时候释放该对象,否则该对象将被泄漏,但是如果在返回之前释放它,它将立即消失。

有两种处理方法:a)使这些方法返回一个新对象,调用者在完成对对象的处理后应释放该对象; b)确保该对象按以下方式释放:调用者完成操作后立即进行。

Cocoa和Cocoa Touch按照约定处理这种情况的方式是选项b):使用自动释放池,因为除了明确创建的对象之外,您不必跟踪所有权。有些人几乎将自动释放用于发布而不是释放,这比释放要低一些,但是更重要的是,它隐藏了当您尝试阅读,浏览和理解代码时可能在释放和自动释放之间做出的有用区分。

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


1
投票

自动释放没有错误-它只是将对象设置为在以后自动释放,而您不必对此进行控制。

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


0
投票

实际上是在使用以下语句创建对象时,

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

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

所以我们必须通过[obj release]释放对象;

如果有一段时间我们无法在特定时间发布。因此,我们将自动发布。如果我们这样做,则NSAutoReleasePool会处理释放操作。

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

Reagrds,

Satya。


0
投票

不,这根本不是错误。自动释放意味着该对象将在当前自动释放池的末尾释放。

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

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

UIApplicationMain启动您的应用程序的运行循环。到达末尾时,(应用程序已关闭)自动释放池中的所有内容都将转储。

现在,如果您隐含多线程并在池中创建自己的自动释放池,则在释放that池时将释放对象。

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

© www.soinside.com 2019 - 2024. All rights reserved.