Objective-C中有兩類對象,一類是結構體(或者基本數據類型也算),另一類是NSObject對象。
- 對于結構體,代碼直接會操作其實體,因此賦值操作會創建一個源對象的副本(一個新的對象);
- 對于NSObject對象,必須使用指針來操作對象,所以其賦值操作相當于復制了指針,而非對象,也就是說賦值操作使得源指針和新指針都指向同一個NSObject對象。這樣講有些難以理解,請看下面的代碼:
assign:###
簡單賦值給新對象,不增加引用計數。也就是說,
- 當在結構體(或者基本數據類型也算)的時候,是創造一個就對象的副本;
- 當在NSObject對象的時候,會把對象的指針賦值。
- (void) setAssignProperty:(id)newValue
{
self->assignProperty = newValue;
}
一般用在:
**基本數據類型\int \float \double\CGRect \真假(BOOL)\結構體**
retain:###
釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1。也就是說,
- 當在NSObject對象的時候,會把舊對象的計數- 1,然后把輸入對象的指針賦值給目標,然后新對象的計數+1。
-(void)setRetainProperty:(id)newValue
{
if (retainProperty != newvalue)
{
[retainProperty release];
retainProperty = [newValue retain];
}
}
一般用在:
一般對象如:NSNumber(除了NSTring 對象外)
copy:###
釋放舊對象,建立一個索引計數為1的對象。也就是說,
- 當在NSObject對象的時候,會把舊對象的計數- 1,把輸入對象的值和內容拷貝成副本(也就是有新的指針,新的一樣的內容),把副本賦值給目標,計數+1。
-(void)setCopyProperty:(id)newValue
{
if (copyProperty != newvalue)
{
[copyProperty release];
copyProperty = [newValue copy];
}
}
一般用在:
NSString、NSMutableString、block