在简单的赋值语句中将对象赋值给另一个对象:
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. 浅赋值与深复制