2011-02-05 4 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'라는 메서드는 자체 결과를 자동으로 릴리즈하지 않아야합니다. –

답변

0

예. 규칙은 당신이 객체를 보유하고있는 경우 객체이며, 또한 iOS에서 객체를 릴리스해야합니다.

4

개체의 소유자 인 경우 - 해제하는 것은 사용자의 책임입니다.

다음 중 하나 이상 수행 한 경우 개체의 소유자가 될 :

  • 은 자세한 내용은 통과 retain
  • copy

을 통과 alloc

  • 를 통해 인스턴스를 세부 정보 읽기 Object Ownership and Disposal

  • +0

    'new'를 잊어 버렸기 때문에,'newObj'가 지침을 따르면 객체는 자동으로 풀어지지 않아야합니다. –

    +1

    @ Georg Fritzsche :'new'는'[[aClass alloc] init];과 같습니다. 따라서'alloc' 만 언급하자면 enaugh이다. description에서'newObj'는 이미 연기 된'release' pass :'alloc 'init'autorelease '를 포함하고 있습니다. 그러므로 여기에 추가로 release 할 필요가 없습니다 –

    +0

    물론'obj'는 이미'anotherMehtod'에서 릴리즈 될 것입니다. 그것이 EXC_BAD_ACCESS 결과 인 이유입니다. –

    0

    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