2010-11-25 5 views
1

일반적으로 개체를 만들고이를 인스턴스 변수에 할당 할 때 임시 개체를 할당하고 개체를 유지하려면 iVar 설정자를 호출 한 다음 임시 개체를 해제하십시오. 그러나 나는 오늘 아침에 init을보고 있었고, 단순히 iVar를 직접 할당하면 setter가 호출되거나 dealloc이 실행될 때 올바르게 해제되는 동안 alloc에 ​​의해 유지된다는 사실을 알았습니다. 이 문제를 올바르게 이해하고 있는지 궁금합니다.메모리 관리 및 인스턴스 변수?

@property(nonatomic, retain) CLLocationManager *locationManager; 

.

@synthesize locationManager; 

// VERSION 001 
- (id)init { 
    self = [super init]; 
    if(self) { 
     CLLocationManager *tempManager = [[CLLocationManager alloc] init]; 
     [self setLocationManager:tempManager]; 
     [tempManager release]; 
    } 
    return self; 
} 

// VERSION 002 
- (id)init { 
    self = [super init]; 
    if(self) { 
     locationManager = [[CLLocationManager alloc] init]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

답변

1

버전 002는 init에서 접근자를 사용하는 함정이 이론적으로 나빠기 때문에 Apple에서 승인 한 답변입니다. 기본적으로 하위 클래스는 접근자를 재정의하도록 선택할 수 있으며 아직 초기화되지 않은 하위 클래스 객체에 메시지를 보냅니다. 다른 곳에서 001

+0

대단히 감사합니다. 매우 감사드립니다. – fuzzygoat

2

메모리 관리에 관한 한 두 가지 해결책이 모두 좋습니다. 하지만 initdealloc에 직접 액세스를 선호 할 수도 있습니다 (this related question 참조).

+0

사용 버전 나는뿐만 아니라 초기화에서 그들을 사용하지 않는 것을 알고 이전 질문, 그것의 좋은에서의 dealloc에서 세터를 사용하지 알고 있었다, 초기화 및 할당 해제를 제외한 그러나

. 그래서 init & delloc에 ​​대해 v_002와 같은 iVars를 직접 할당한다고 말하면 좋을 것입니다. alloc 객체를 사용하는 것이 가장 좋은 다른 메소드의 경우 setter를 사용하여 iVar을 할당하고 마지막으로 객체를 릴리스하십시오. – fuzzygoat