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 中的规则是,如果方法名称以new
、copy
、retain
或alloc
开头,调用者必须发送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 自动释放