Objective C 自动释放

Posted

技术标签:

【中文标题】Objective C 自动释放【英文标题】:Objective C autorelease 【发布时间】:2011-02-05 14:59:31 【问题描述】:

你好,我不完全理解 obj-C 中的 autorelease 函数调用。

@interface A
id obj;


@implementation A

-(void)myMethod;

obj = [BaseObj newObj];           //where newObj is a method like :[[[BaseObj alloc]init]autorelease];


-(void)anotherMehtod;

[obj someMeth];                     //this sometimes gives me EXC_BAD_ACCESS


@end

所以为了解决这个问题,我设置了一个保留。现在如果我保留它,我需要手动释放它吗?

【问题讨论】:

附注:Cocoa 中的规则是,如果方法名称以newcopyretainalloc 开头,调用者必须发送release 或@ 987654327@ 来平衡它。所以名为newObj 的方法不应该自动释放自己的结果。 【参考方案1】:

如果您是对象的所有者 - 您有责任释放它。

如果您至少完成了以下一项操作,您将成为对象的所有者:

通过alloc实例化它 通过retain 通过copy

更多详情请阅读Object Ownership and Disposal

【讨论】:

你忘记了new,所以如果+newObj 遵循指导方针,那么该对象甚至不应该首先被自动释放。 @Georg Fritzsche:new[[aClass alloc] init]; 相同。因此,仅提及alloc 就够了。描述中的+newObj 已经包含推迟的release 通过:alloc]init]autorelease],所以这里不需要额外的release 当然obj 已经在anotherMehtod 发布了,这就是为什么EXC_BAD_ACCESS 结果【参考方案2】:

是的。规则是,如果你保留一个对象,你也有责任在 ios 中释放它。

【讨论】:

【参考方案3】:

与 Obj-C 中的所有其他静态方法一样,[BaseObj newObj] 仅存在于您的方法 -(void)myMethod 在此方法的末尾(大致)obj 从自动释放池中获取 -release 消息。

如果您想保留此对象 - 使用 [[BaseObj newObj] retain][BaseObj alloc] init] 并在 -dealloc 或必须时释放它。

例如:

@interface A
  id obj;


@implementation A

-(void)myMethod

  [obj autorelease];
  obj = [[BaseObj newObj] retain];           //where newObj is a method like :[[[BaseObj alloc]init]autorelease];


-(void)anotherMehtod;

  [obj someMeth];                     //this sometimes gives me EXC_BAD_ACCESS


-(void)dealloc

  [obj release];
  [super dealloc];


@end

【讨论】:

以上是关于Objective C 自动释放的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSNumberFormatter 循环中的 Objective C 自动释放

Objective-C 自动释放池不释放对象

在一个线程中创建并在objective-C中传递给另一个线程的自动释放对象

Objective-C 自动释放内存管理

Objective-C 和返回时自动释放

Objective-c:从方法返回自动释放的对象