2011-07-08 83 views
0

我有了一個屬性的類:如何妥善管理ID實例變量分配則保留

@property (nonatomic, assign) id customDatePicker 

基於用戶選擇,我需要一個的UIDatePicker或UIPicker所以我強制轉換伊娃並保留它,隨後釋放它。這是管理財產記憶的正確方法嗎?

// init snippet 
if (useUIDatePicker) { 
    customDatePicker = (UIDatePicker *)[[[UIDatePicker alloc] initWithFrame:frame] retain]; 
} else { 
    customDatePicker = (UIPickerView *)[[[UIPickerView alloc] initWithFrame:frame] retain]; 
} 

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

回答

2

當財產申報爲assign,你不應該保留的對象。 assign選項用於非對象變量以及編輯屬性爲retain的情況下會創建一個循環,並且兩個對象彼此保持一致。聲明屬性爲assign意味着您不會管理對象的內存;你不應該打電話retainrelease就可以了。

您還過度保留選取器對象。保留一個物體會在物體上產生一個聲明;你不希望它消失,直到你說你完成了它。您放棄索賠,允許通過調用release刪除對象。當您撥打alloc時,會產生與撥打retain相同的聲明。所以這條線:

[[[UIDatePicker alloc] initWithFrame:frame] retain]; 

創建索賠,一爲alloc,一個用於retain。稍後,您只需調用release一次,這意味着您將始終對此對象有一個聲明,並且它將變成內存泄漏。

你應該做的是:

@property (nonatomic, retain) id customDatePicker 


if (useUIDatePicker) { 
    customDatePicker = [[UIDatePicker alloc] initWithFrame:frame]; 
} else { 
    customDatePicker = [[UIPickerView alloc] initWithFrame:frame]; 
} 

現在你對選擇器只有一個要求,因爲你使用alloc

(你並不需要轉換分配;當你分配到一個通用的指針,你可以使用任何類型的對象。)

也看看蘋果Memory Management文檔。

+1

@Cory此外,如果你想發送保留和釋放到id類型的對象,至少要確保它符合NSObject協議,聲明它爲'id '。 – Joe

+0

@Josh謝謝你的答案。我有一種感覺,我正在以錯誤的方式去做。謝謝。 –

+0

@Cory:很高興幫助! –