2010-11-25 58 views
1

通常,當我創建一個對象並將其分配給一個實例變量時,我分配一個臨時對象,調用iVar setter來保留該對象,然後釋放該臨時對象。然而,我在今天早上看到了init,並注意到如果我直接分配iVar,則它保留在alloc中,同時在調用setter或執行dealloc時也可以正確釋放。我只是好奇,如果我正確理解這一點?內存管理和實例變量?

@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是Apple批准的答案,因爲在init中使用存取器的缺陷在理論上更糟糕。基本上,子類可以選擇覆蓋您的訪問器,然後您將發送消息給尚未初始化的子類對象。

然而,在其他地方,除了init和dealloc的,使用版本001

+0

謝謝你一個非常明確的答案,非常感謝。 – fuzzygoat 2010-11-25 16:24:58

2

就內存管理而言,兩種解決方案都很好。但您可能想要直接訪問initdealloc,請參閱this related question

+0

我不知道使用的dealloc制定者從以前的問題,其良好的知道,我不應該在初始化使用它們爲好。所以我會說,對於init和delloc直接分配像v_002這樣的iVars。對於其他方法,最好使用alloc對象,使用setter來分配iVar&finally釋放對象。 – fuzzygoat 2010-11-25 15:34:22