2011-08-22 53 views
3

可能重複:
Properties and Instance Variables in Objective-C 2.0Objective-C的屬性有或沒有實例變量

我使用性質僅高德不需要任何真正的得到驗證時,或設定一個我正在創作的類的值。

Ex: 
@interface ClassB : NSObject 
{ 
    // No ivars 
} 

@property (nonatomic, retain) ClassA *obj; 
@property (nonatomic, retain) NSString *str; 

每當我打電話,我總是用self.obj/self.str或[自OBJ]/[自STR]類中的這些方法。這樣做是爲了設置你被迫通過屬性的對象的狀態,以便由編譯器生成的getter和setter更仔細地管理引用。有了這個說法,我可以用這種方式創建我的類嗎?另外,在沒有ivar的情況下,是否在@implementation文件中覆蓋「dealloc」方法中需要「釋放」?

回答

3

如果您正在使用@synthesize指令來創建屬性訪問器,編譯器還將創建你離開了類聲明的任何實例變量。你仍然需要釋放你的ivars。它曾經是,你不能直接訪問實例變量的合成,因此不得不使用屬性setter在-dealloc方法是這樣的:

- (void)dealloc 
{ 
    self.obj = nil; 
    self.str = nil; 
    [super dealloc]; 
} 

這些天來,雖然,編譯器將讓你訪問合成伊娃直接,所以你可以釋放它,而不是調用setter方法(這是在-dealloc一個好主意,和一個壞主意,在其他地方):

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

這將改變,當你最終將代碼轉換爲ARC(自動引用計數),因爲編譯器會照顧在-dealloc中釋放你的ivars。大多數情況下,這意味着你的-dealloc實現可能會消失。

+0

是否會更好的編程實踐(直到ARC代碼)做一個指針分配爲零,或做一個發佈? – 5StringRyan

+0

如果您保留了一個對象,則必須將其釋放。只要將指針設置爲零就會產生泄漏 - 你失去了對象的引用,但是你永遠不會釋放該對象。如果你想在釋放它之後將指針設置爲零,請隨意。有些人喜歡看指針變爲零。儘管如此,它在-dealloc中並沒有什麼幫助,因爲無論如何,「self」即將被釋放。 – Caleb

+0

在BJ Homers示例中,由於他直接分配self.obj/self.str = nil,因爲它們沒有被釋放並且指針指定爲零,是否會創建泄漏? – 5StringRyan

0

編譯器自動爲您創建ivar,即使它沒有在ivar列表中明確定義。它的名稱與房產列表中的名稱相同。編譯器現在不需要重複的定義行。

如果您有需要發佈的屬性(ivars),請執行此操作。

2

沒有必要明確聲明您的IVAR。我甚至建議省略它們,因爲你應該總是通過訪問器訪問IVars(正如你指出你已經做了什麼)。

除了調試器不直接接收IVars,你不會遇到任何問題(它們不會很好地顯示在你的控制檯旁邊) - 但這不是一個真正的問題。

在你的dealloc方法中,你不需要再釋放它們。你需要做的是零。

自我。obj = nil;

-

這裏是什麼樣的屬性實際上屬性指的是簡要概述: (這是告訴你,當你在的dealloc NIL變量的釋放情況)

分配

@property(assign)NSString * name;

name = newValue; 

保留

@property(保留)的NSString *名稱;

if (name != newValue) { 
    [name release]; 
    name = [newValue retain]; 
} 

副本

@property(副本)的NSString *名稱;

if (name != newValue) { 
    [name release]; 
    name = [newValue copy]; 
} 
+1

這不是真的,你不應該總是通過getter和setter,它實際上鼓勵直接在'init'和'dealloc'方法中訪問ivars以避免潛在的副作用。您還可以訪問合成屬性以將其釋放,例如'[_myProperty release]'意味着你可以像前面提到的那樣避免'dealloc'中的間接訪問 –

+0

好點。你有一個例外的前述經驗法則:-) – pkluz

+0

@ Paul.s:合成的伊娃沒有領先的下劃線;它的名稱與該屬性完全相同。 –

相關問題