2012-02-29 61 views
0

我的問題看起來像十幾個關於釋放屬性,但我找不到我正在尋找的確切答案。發佈(非原子,保留)合成屬性

當屬性都被定義爲保留:

@property (nonatomic, retain) NSString * myString; 

然後

@synthesize myString; 

它生成getter和setter與保持和釋放操作。好的。

當然,屬性必須在dealloc中釋放。

-(void)dealloc { 
    [myString release]; 
    myString = nil; 
    [super dealloc]; 
} 

這樣很乾淨。

但是,如果我從不使用myString?它是否預先初始化?我的意見是myString保留計數爲0.但釋放myString在dealloc會減少它,並使應用程序崩潰?但它不會崩潰!

是一種更簡潔的方式來釋放它嗎?

if(myString != nil) { 
    [myString release]; 
    myString = nil; 
} 

回答

2

你缺少的關鍵是你可以發送消息到零。所以不,你的後一種方法並不清潔,只是不必要的。

如果你從不使用myString,它不會被初始化爲任何東西。它仍然是零。當你釋放它時,你實際上正在做[nil release] - 這實際上沒有做任何事情。因此沒有崩潰。

1

有沒有必要檢查它是否是nil。 如果您將版本發送到nil對象沒有任何反應,那麼爲什麼檢查。

當創建一個對象實例時,該屬性將被設置爲nil,除非您在任何init方法中初始化它。

與您在方法中創建的變量不一樣,它們可能指向無效內存。因此將這些設置爲nil是安全的方式。這對於屬性不需要。

1

您可以將發佈消息發送到objective-c中的nil對象,這樣沒有任何反應。我的意思是應用程序不會崩潰。當在多線程環境中使用對象時,將對象設置爲零的想法很方便,因爲使用多線程時,您無法始終保證只有在釋放實例變量之前才能讀取它。

0

如果您使用的是@property(retain/copy) & @synthesize有沒有必要檢查nil。它不會崩潰或拋出EXC_BAD_ACCESS

否則,如果您不使用它,則必須檢查變量是否爲nil,否則將會崩潰,如果變量爲nil