讓我們假設我創建了一個屬性爲NSString類型的tempStr。 我明顯地合成了它。如果某個屬性的值被覆蓋,會發生什麼?
在我的一個方法中,我將tempstr的值設置爲yellowcolor。 然後在那之後,我用redcolor重新初始化tempStr。
所以我想知道在這種情況下tempStr的內存會發生什麼。
Thanx。
讓我們假設我創建了一個屬性爲NSString類型的tempStr。 我明顯地合成了它。如果某個屬性的值被覆蓋,會發生什麼?
在我的一個方法中,我將tempstr的值設置爲yellowcolor。 然後在那之後,我用redcolor重新初始化tempStr。
所以我想知道在這種情況下tempStr的內存會發生什麼。
Thanx。
這取決於您爲您的財產設置了什麼屬性:retain
,assign
或copy
。
@property (retain) NSString *tempStr
:舊值(yellowcolor)將被釋放並且新值(redcolor)將被保留。唯一的例外是yellowcolor == redcolor
。那麼什麼都不會發生,因爲新舊價值觀是一樣的。@property (assign) NSString *tempStr
:將不會有發佈/保留操作。這等於只改變一個指針。因此,在此操作之後,黃色將不會被釋放,並且您將失去對它的引用(如果代碼中沒有其他引用)。所以它可能導致內存泄漏。@property (copy) NSString *tempStr
:它與retain
類似,但它調用copy
上的新值而不是retain
,所以它會在內存中創建一個重複的對象。考慮到NSString,它等於retain
,因爲NSString是不可變的,所以不需要重複。你可以找到一些代碼示例here。
編輯:作爲@Bavarious提到,copy
等於retain
只有當你初始化這個屬性NSString
。如果你用NSMutableString
初始化它,這是不可能的,因爲這個是可變的,所以這個「正確」的副本就是make。
一個合成的setter看起來有點像這樣:
- (void)setSomeString:(NSString *)newString
{
if ([newString isEqualToString:someString]) return;
[someString autorelease];
someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}
因此,當新的值被分配到指針舊值被釋放。
請注意,'NSString'屬性可以指定爲'NSMutableString'對象,在這種情況下,'copy'不會充當'retain'。 – 2011-06-18 10:27:16