2011-02-05 69 views
2

你好,我不完全理解obj-C中的autorelease函数调用。Objective 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 

所以要解决这个问题,我把一个保留。现在,如果我保留它,我需要手动释放这个对象吗?

+4

一个侧面说明:在可可的规则是,如果一个方法名以`new`,`copy`,`retain`,或`alloc`启动,调用者必须发送`release'或`autorelease`来平衡它。所以名为`newObj`的方法不应该自动释放它自己的结果。 – 2011-02-05 15:04:20

回答

0

是的。规则是,如果你的保留一个对象,你也有责任在iOS中发布它。

4

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

你成为一个对象的所有者,如果你已经做了以下的至少一个:

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

更多细节阅读Object Ownership and Disposal

+0

你忘了`new`,所以如果`newObj`遵循指南,那么对象甚至不应该首先被自动释放。 – 2011-02-05 15:27:46

0

像Obj-C [BaseObj newObj]中的所有其他静态方法一样,只有在方法结尾处的方法-(void)myMethod(大致)obj从autorelease池获得-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