2011-06-18 44 views
1

讓我們假設我創建了一個屬性爲NSString類型的tempStr。 我明顯地合成了它。如果某個屬性的值被覆蓋,會發生什麼?

在我的一個方法中,我將tempstr的值設置爲yellowcolor。 然後在那之後,我用redcolor重新初始化tempStr。

所以我想知道在這種情況下tempStr的內存會發生什麼。

Thanx。

回答

2

這取決於您爲您的財產設置了什麼屬性:retain,assigncopy

  • @property (retain) NSString *tempStr:舊值(yellowcolor)將被釋放並且新值(redcolor)將被保留。唯一的例外是yellowcolor == redcolor。那麼什麼都不會發生,因爲新舊價值觀是一樣的。
  • @property (assign) NSString *tempStr:將不會有發佈/保留操作。這等於只改變一個指針。因此,在此操作之後,黃色將不會被釋放,並且您將失去對它的引用(如果代碼中沒有其他引用)。所以它可能導致內存泄漏。
  • @property (copy) NSString *tempStr:它與retain類似,但它調用copy上的新值而不是retain,所以它會在內存中創建一個重複的對象。考慮到NSS​​tring,它等於retain,因爲NSString是不可變的,所以不需要重複。

你可以找到一些代碼示例here

編輯:作爲@Bavarious提到,copy等於retain只有當你初始化這個屬性NSString。如果你用NSMutableString初始化它,這是不可能的,因爲這個是可變的,所以這個「正確」的副本就是make。

+0

請注意,'NSString'屬性可以指定爲'NSMutableString'對象,在這種情況下,'copy'不會充當'retain'。 – 2011-06-18 10:27:16

1

一個合成的setter看起來有點像這樣:

- (void)setSomeString:(NSString *)newString 
{ 
    if ([newString isEqualToString:someString]) return; 

    [someString autorelease]; 
    someString = [newString copy]; // or [newString retain], depends how you defined the property ... 
} 

因此,當新的值被分配到指針舊值被釋放。

相關問題