我们 可以对基础框架中的物件 采取 copy 或者 mutableCopy这两项措施 来复制 物件。这 是 通过实施 <NSCopying>这项协议中的措施 实现的。如果 你 需要区别 可修改的复制品 和 不可修改的复制品,你 可以根据<NSMutableCopying>这项协议 实施 措施。
下面的程序 示范了 如何复制 物件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #import <Foundation/NSObject.h> #import <Foundation/NSArray.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> int main(int argc,const char *argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; NSMutableArray *dataArray=[NSMutableArray arrayWithObjects:@"one",@"two",@"three",@"four",nil]; NSMutableArray *dataArray2; //用等号连接物件和变量 dataArray2=dataArray; [dataArray2 removeObjectAtIndex:0]; NSLog(@"dataArray:"); for(NSString *element in dataArray) { NSLog(@"%@",element); } NSLog(@"dataArray2:"); for(NSString *element in dataArray2) { NSLog(@"%@",element); } //复制物件 dataArray2=[dataArray mutableCopy]; [dataArray2 removeObjectAtIndex:0]; NSLog(@"dataArray:"); for(NSString *element in dataArray) { NSLog(@"%@",element); } NSLog(@"dataArray2:"); for(NSString *element in dataArray2) { NSLog(@"%@",element); } [dataArray2 release]; [pool drain]; return 0; } |
运行 这个程序后,可以得到 这样的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
2012-06-01 14:09:24.766 Sample[1030:707] dataArray:
2012-06-01 14:09:24.768 Sample[1030:707] two
2012-06-01 14:09:24.773 Sample[1030:707] three
2012-06-01 14:09:24.775 Sample[1030:707] four
2012-06-01 14:09:24.776 Sample[1030:707] dataArray2:
2012-06-01 14:09:24.776 Sample[1030:707] two
2012-06-01 14:09:24.776 Sample[1030:707] three
2012-06-01 14:09:24.777 Sample[1030:707] four
2012-06-01 14:09:24.777 Sample[1030:707] dataArray:
2012-06-01 14:09:24.778 Sample[1030:707] two
2012-06-01 14:09:24.778 Sample[1030:707] three
2012-06-01 14:09:24.779 Sample[1030:707] four
2012-06-01 14:09:24.779 Sample[1030:707] dataArray2:
2012-06-01 14:09:24.779 Sample[1030:707] three
2012-06-01 14:09:24.780 Sample[1030:707] four
|
在这个程序中 我们 创建了 一个可修改的数组物件dataArray,并且 将 常量字符串物件@”one”,@”two”,@”three”,@”four” 依次 添加 到这个数组物件当中。在之前 提到过
这行语句 仅仅 将 数组物件dataArray的地址 存储 在变量dataArray2当中。接着
|
[dataArray2removeObjectAtIndex:0];
|
这行语句 将 数组物件dataArray2中的第0个物件 移除。
最后 我们 将 数组物件dataArray 和 dataArray2中的物件 显示出来,我们 可以看到 两个数组物件中的第0个物件,也就是 @”one”,不见了。
接下来
| dataArray2=[dataArray mutableCopy]; |
这行语句中 对数组物件dataArray 采取了 mutableCopy这项措施,创建了 一个dataArray的复制品,并且 将 这个复制品的地址 存储 在变量dataArray2当中。通过这样的方式,我们 在内存中 就有了 两个独立的数组物件,并且 都包含 三个元素。现在 如果 我们 移除 数组物件dataArray2当中的元素 对数组物件dataArray中的元素 没有 任何影响,这点 从程序的运行结果 就可以看得出来。
你 可以为不可修改的物件 创建 可修改的复制品。同样的道理,你 也可以为可修改的物件 创建 不可修改的复制品。
如果 你 为数组物件 创建 复制品,那么 这个数组物件中 每个物件的引用次数 都会增加 1次。我们 向NSMutableArray这类物件 发送了 arrayWithObjects:这条消息 创建了 dataArray这个物件,而 arrayWithObjects:这条消息 会将 dataArray这个物件 添加 到自动释放池中,而 接着 我们 用mutableCopy这项措施 创建了 一个dataArray的复制品dataArray2,而 mutableCopy这项措施 却没有将 dataArray2这个物件 添加 到自动释放池,于是 我们 需要手动减少 它的引用次数,就像 这样: