看了一下网上对于NSArray和NSMutableArray的深浅拷贝的文章,觉得有些地方不靠谱,自己做了一下实验,将结果留档
NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *mArrayCopy2 = [mArray1 copy];
NSLog(@"mArray1 address:%p", mArray1);
NSLog(@"mArrayCopy2 address:%p", mArrayCopy2);
NSLog(@"The first object address in mArray1:%p", [mArray1 objectAtIndex:0]);
NSLog(@"The first object address in mArrayCopy2:%p", [mArrayCopy2 objectAtIndex:0]);
NSMutableArray *mArrayMCopy1 = [mArray1 mutableCopy];
NSLog(@"mArrayMCopy1 address:%p", mArrayMCopy1);
NSLog(@"The first object address in mArrayMCopy1:%p", [mArrayMCopy1 objectAtIndex:0]);
如上所示,mArray1是一个fixed的Array, 自己不能变化。 mArrayCopy2是使用copy方法复制的fixed对象 mArrayMCopy1是使用mutableCopy方法复制的可变数组
输出结果如下
2013-05-29 03:05:58.649 CopyTest[4679:707] mArray1 address:0x100114d40
2013-05-29 03:05:58.652 CopyTest[4679:707] mArrayCopy2 address:0x100114d40
2013-05-29 03:05:58.654 CopyTest[4679:707] The first object address in mArray1:0x1001149e0
2013-05-29 03:05:58.655 CopyTest[4679:707] The first object address in mArrayCopy2:0x1001149e0
2013-05-29 03:05:58.657 CopyTest[4679:707] mArrayMCopy1 address:0x1030000a0
2013-05-29 03:05:58.658 CopyTest[4679:707] The first object address in mArrayMCopy1:0x1001149e0
可以看到mArray1和MArrayCopy2指向同一个数组地址,这个数组里面的第一个对象的地址也是相同的。但是mArrayMCopy1指向的是另外一个数组,这个数组是指针数组,他们指向的具体的对象的地址和mArray1是相同的,不是完全意义上的深拷贝,如果是完全意义上的深拷贝,应该指向对象的地址也会改变。当然这里尝试的是字符串。因为Xcode对字符串有优化,我想我应该使用别的对象来试试。
实践证明,和使用NSString的结果是一样的