2011-02-05 37 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