origin = pt;
其中origin 和 pt 都是帶有兩個整型實例變量x和y的XYPoint 對象,這樣的賦值結果僅僅是將對象pt 的地址複製到origin中,賦值操作結束後兩個變量都指向內存中的同一個地址。當使用一條消息對實例變量進行修改:
[origin setX:100 andY:300]
這時同時改變了origin和pt變量共同引用的XYPoint對象的x,y座標,因爲它們都引用內存中同一個對象。這樣同時適用於Foundation對象:將一個對象賦值給另一個對象僅僅是創建了一個對這個對象的引用。所以,如果dataArray 和dataarray2 都是NSMutableArray對象:
dataArray2 = dataArray;
[dataArray2 removeObjectAtIndex:0];
這個操作將對兩個變量引用的同一個數組中刪除第一個元素。
1. copy和mutableCopy方法
Foundation 類實現了名爲copy 和mutableCopy的方法,可以使用這些方法創建對象的副本。通過實現符合<NSCopying> 協議(用於製作副本)的方法來完成此任務。如果類必須區分要產生的對象的是可變副本還是不可變副本,還需要<NSMutableCopying>協議實現一個方法。
如Foundation 類中的copy方法,在前面描述的兩個NSMutableArray對象dataArray2和dataArray, 語句:
dataArray2 = [dataArray mutableCopy]
在內存中創建一個dataArray副本,並複製了它的所有元素。執行語句:
[dataArray2 removeObjectAtIndex:0]
上面刪除了dataArray2中的第一個元素,但不刪除dataArray中的第一個元素。 下面代碼詳細展示:
#import <Foundation/Foundation.h>
int main (int argc, char *argv[])
{
@autoreleasepool{
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects: @"one",@"two", @"three",nil];
NSMutableArray *dataArray2;
//簡單複製
dataArray2 = dataArray;
[dataArray2 removeObjectAtIndex:0]
NSLog(@"dataArray: ");
for (NSString *elem in dataArray)
NSLog(@“%@”,elem);
NSLog (@"dataArray2: ");
for (NSString *elem in dataArray2)
NSLog (@"%@",elem);
//創建一個可變副本
dataArray2 = [dataArray mutableCopy];
[dataArray2 removeObjectAtIndex:0];
NSLog (@"dataArray: ");
for (NSString *elem in dataArray)
NSLog(@"%@", elem);
NSLog (@"dataArray2: ");
for (NSString *elem in dataArray2)
NSLog (@" %@", elem);
}
return 0;
}
輸出結果:
dataArray:
two
three
four
dataArray2:
two
three
four
dataArray:
two
three
four
dataArray2:
three
four
dataArray2 = dataArray; 僅僅創建了對內存中同一個對象的另一個引用。在從dataArray2中刪除第一個對象後兩個引用中的第一個元素都會消失。
然後創建一個dataArray的可變副本並將它賦值給dataArray2的最終副本:這在內存中創建了兩個不同的可變數組。
注意:產生一個對象的可變副本並不要求被複制的對象本身是可變。這種情況同樣適用於不可變副本:可以創建可變對象的不可變副本。
2. 淺賦值與深複製