2014-06-14 118 views
0

我想驗證一些我總是使用的東西,但是當我考慮它時...我感到困惑爲什麼它以這種方式工作,我確定我閱讀了有關它的解釋,但無法找到它。 據我瞭解蘋果創建他們的setter是這樣的。更改屬性對象不會影響屬性

-(void)setString:(NSString *)value { 
    if (_string != value) { 
     [_string release]; 
     _string = [value retain]; 
    } 
} 

現在通常我會創建像這樣的屬性。

@property (nonatomic) NSString *string; 
@synthesize string = _string; 

的問題是關於下一個代碼:

 NSString *s = @"Should be deleted"; 
     [self setString:s]; 
     NSLog(@"string check111 =%@",self.string); 
     s = NULL; 
     NSLog(@"string check222=%@",self.string); 

相同的輸出將被生成。從setter中我可以看到我的屬性指向了我更改的對象,但屬性值將是相同的。這種情況觸發另一個問題(如果它的工作原理爲什麼我需要複製屬性)。 有人可以提供一個簡短的解釋嗎? (或具體鏈接閱讀)。 Tnx很多。 (我覺得我的問題可能已經要求在論壇)

+0

您斷言「應該刪除字符串」首先是錯誤的。只需設置NULL的引用與它指向的對象的釋放無關。 – erkanyildiz

+0

你沒事,如果我有機會,我會刪除那個愚蠢的問題。 –

回答

4

,沒有任何效果,因爲你改變了對象,該s點。

這個圖或許可以解釋它更好,原來你是這樣的:

enter image description here

改變的s點不會影響_string

enter image description here

設置複製的屬性的想法是如果你的字符串屬性設置爲可變的字符串,然後改變它的內容。看到這個question

+0

是的,你完全正確,我不會在發佈這類問題時想到的。 –

1

我想這會是這樣的

NSString *s = @"Should be deleted"; // create autoreleased string 
    [self setString:s]; // retain string 
    NSLog(@"string check111 =%@",self.string); 
    s = NULL; // reset pointer value to null. This operation doesn't affect string object 
    NSLog(@"string check222=%@",self.string); 
    // string's retain counter will be decreased by autorelease pool later