【Object-C】浅复制与深复制
来源:互联网 发布:百合手更新软件 编辑:程序博客网 时间:2024/06/07 03:53
首先先看一下下面的一段代码:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
- [NSMutableString stringWithString:@"one"],
- [NSMutableString stringWithString:@"two"],
- [NSMutableString stringWithString:@"three"],
- nil
- ];
- NSMutableArray *dataArray2;
- NSMutableString *mStr;
- NSLog(@"dataArray: ");
- for(NSString *elem in dataArray)
- NSLog(@" %@", elem);
- //执行一个拷贝,然后改变其中的一个字符串(浅复制)
- dataArray2 = [dataArray mutableCopy];
- //这种方式会同时改变连个数组中的对象
- mStr = [dataArray objectAtIndex:0];
- [mStr appendString:@"ONE"];
- NSLog(@"dataArray:");
- for(NSString *elem in dataArray)
- NSLog(@" %@",elem);
- NSLog(@"dataArray2:");
- for(NSString *elem in dataArray2)
- NSLog(@" %@",elem);
- [dataArray2 release];
- }
- return 0;
- }
使用上述方法的执行结果如下:
注意:原始数组及其副本中的第一个元素的值:他们都被修改了。为什么会产生这样的结果呢?
或许你能理解为什么dataArray的第一个元素发生改变,但是不明白为什么它的副本也会改变。
这与默认的浅复制方式有关。它意味着使用mutableCopy方式复制数组时,在内存中为新的数组对象分配了空间,并且将单个元素复制到新的数组中。然而将原始数组中每个元素复制到新位置意味着:仅将引用从一个数组元素复制到另一个数组元素。这样做的最终结果,就是这两个数组中的元素都指向内存中的同一个字符串。这与将一个对象赋值给另一个对象没有什么不同。
要为数组中每个元素创建完全不同的副本,需要执行所谓的深复制。这就意味着要创建数组中的每个对象内容的副本,而不仅是这些对象的引用的副本(并且考虑一下,如果一个数组中的元素本身是数组对象时,深复制意味着该如何处理?)
假设想要更改其中一个集合而不是他的副本,那么可能要为单个元素创建自己的副本。例如假设想要更改代码中的dataArray2的第一个元素,但不更改dataArray的第一个元素,可以创建一个新的字符串(使用stringWithString:之类的方法)并将它存储到dataArray2的第一个位置,如下所示:
- //这种方式只会改变一个数组中的对象,而对另外一个没有影响
- mStr = [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];
- [mStr appendString:@"ONE"];
- [dataArray2 replaceObjectAtIndex:0 withObject:mStr];
如果顺利的话,你会发现即使替换了数组中的对象之后,mStr和dataArray2的第一个元素仍指向内存中的同一个对象。这意味着随后在程序中对mStr做的任何修改,也将会更改数组 的第一个元素。如果这不是你想要的,则可以总是释放mStr,并分配新实例,因为对象会被replaceObject:atIndex:withObject:方法自动保持。
- Object-C中浅复制与深复制
- 【Object-C】浅复制与深复制
- Object-C学习(九):浅复制与深复制
- object-c 深复制和浅复制
- Objective C: 浅复制与深复制
- Object C 2.0 浅复制
- object-c 复制 (copy)
- Object C 复制对象
- 浅复制与深复制
- 浅复制与深复制
- 深复制与浅复制
- 浅复制与深复制
- 深复制与浅复制
- 深复制与浅复制
- 浅复制与深复制
- 浅复制与深复制
- 浅复制与深复制
- 浅复制与深复制
- SSH分页技术
- 联编
- 多表联接
- x265平台实现WPP
- 小兔子和小鸡在一个笼子里
- 【Object-C】浅复制与深复制
- oracle spfile在线修改时损坏的经验分享
- href=#与href=javascriptvoid(0)的区别
- android安全问题(一) 静音拍照与被拍
- java 时间相关类
- iOS6.0旋转兼容的那点事
- VBS 连接 ODBC
- java经典面试题(4)
- C/C++与lua互调函数的方法