Objective-C中的对象复制
来源:互联网 发布:音乐剪辑软件绿色版 编辑:程序博客网 时间:2024/06/05 21:03
基本数据类型之间变量的复制是值传递,而引用类型之间对象的赋值是引用传递。这样如果一个对象赋值给另一个对象,当其中一个对象的属性被修改时,另外一个对象的属性也同时被修改。
定义一个Person对象,有两个属性name和age。假设per1对象的地址是0x123,将per1赋值给per2,是将per1的地址赋值给per2,所以per1和per2的地址相同,他们指向同一个对象。这样当第一个对象的属性改变是,第二个对象也会跟着改变。为了使第一个对象的改变不会影响到第二个对象,我们需要复制对象。
//测试赋值- (void)testAssign{ Person *per1 = [[Person alloc] init]; per1.age = 20; per1.name = @"tom"; Person *per2 = per1; per2.name = @"big tom"; per2.age = 21; NSLog(@"per1's name = %@, age = %d", per1.name, per1.age); NSLog(@"per2's name = %@, age = %d", per2.name, per2.age);}程序的输出结果如下:
2014-11-09 19:41:56.887 DeepCopy[842:93206] per1's name = big tom, age = 21
2014-11-09 19:41:56.888 DeepCopy[842:93206] per2's name = big tom, age = 21
这个问题同样出现在集合数组中,我们将一个数组赋值给另外一个数组,当删除一个数组的一个元素时,第二个数组中的元素也将被删除。
//测试赋值2- (void)testAssign2{ NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"1", @"2", @"3",nil]; NSMutableArray *array2 = array1; //删除第二个数组中的元素 [array2 removeObjectAtIndex:0]; //遍历第一个数组 for (NSString *item in array1) { NSLog(@"%@", item); } NSLog(@"%@", @"-----------------------"); //遍历第二个数组 for (NSString *item in array2) { NSLog(@"%@", item); }}
程序的输出结果如下:
2014-11-09 19:49:53.932 DeepCopy[874:96111] 3
2014-11-09 19:49:53.933 DeepCopy[874:96111] -----------------------
2014-11-09 19:49:53.933 DeepCopy[874:96111] 2
2014-11-09 19:49:53.933 DeepCopy[874:96111] 3
为避免上述出现的问题,可以复制对象。NSObject提供了两个方法:-(id)copy 和 -(id)mutableCopy,其中copy方法可以拷贝一个不可变对象,而mutableCopy方法可以拷贝一个可变对象,例如NSMutableArray,NSMutableSet等。
下面给出一个NSMutableArray,使用mutableCopy方法拷贝一个对象复制给一个新对象,这样当从第一个数组中删除一个元素时,第二个数组并没有发生改变。
//测试拷贝- (void)testCopy{ NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"1", @"2", @"3",nil]; NSMutableArray *array2 = [array1 mutableCopy]; //删除第二个数组中的元素 [array2 removeObjectAtIndex:0]; //遍历第一个数组 for (NSString *item in array1) { NSLog(@"%@", item); } NSLog(@"%@", @"-----------------------"); //遍历第二个数组 for (NSString *item in array2) { NSLog(@"%@", item); }}
程序的输出结果如下:
2014-11-09 20:01:20.008 DeepCopy[931:100350] 1
2014-11-09 20:01:20.008 DeepCopy[931:100350] 2
2014-11-09 20:01:20.008 DeepCopy[931:100350] 3
2014-11-09 20:01:20.008 DeepCopy[931:100350] -----------------------
2014-11-09 20:01:20.009 DeepCopy[931:100350] 2
2014-11-09 20:01:20.009 DeepCopy[931:100350] 3
对象复制分为深复制和浅复制,浅复制只复制对象本身,对象包含或关联的对象并不复制,而深复制不光复制对象本身,对象包含或关联的对象也将被同时复制。
下面定义一个可变数组,可变数组中添加若干可变字符串。如果进行浅复制,数组中的元素将会受到影响,如果进行深复制,数组的元素将不会受到影响。
//测试拷贝- (void)testCopy2{ NSMutableArray *array1 = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"1"], [NSMutableString stringWithString:@"2"], [NSMutableString stringWithString:@"3"],nil]; //浅复制// NSMutableArray *array2 = [array1 mutableCopy]; NSMutableArray *array2 = [NSMutableArray arrayWithCapacity:3]; //复制数组中的每一个元素 for (NSString *str2 in array1) { [array2 addObject:[str2 mutableCopy]]; } //改变第一个数组中的元素 NSMutableString *str = [array1 objectAtIndex:0]; [str appendString:@"changed"]; //遍历第一个数组 for (NSString *item in array1) { NSLog(@"%@", item); } NSLog(@"%@", @"-----------------------"); //遍历第二个数组 for (NSString *item in array2) { NSLog(@"%@", item); }}
程序运行结果如下:
2014-11-09 20:44:44.775 DeepCopy[972:106532] 1changed
2014-11-09 20:44:44.775 DeepCopy[972:106532] 2
2014-11-09 20:44:44.775 DeepCopy[972:106532] 3
2014-11-09 20:44:44.775 DeepCopy[972:106532] -----------------------
2014-11-09 20:44:44.775 DeepCopy[972:106532] 1
2014-11-09 20:44:44.775 DeepCopy[972:106532] 2
2014-11-09 20:44:44.776 DeepCopy[972:106532] 3
- Objective-C中的对象复制
- objective-c 复制对象
- Objective-C 对象复制 简单实现
- objective-c中的数字对象
- Objective-c中的面向对象
- objective C中的浅复制和深复制
- objective C中的浅复制和深复制
- objective C中的浅复制和深复制
- Objective-C中的NSNumber数字对象
- 深入理解Objective-C中的对象
- Objective-C中的类和对象(instance)
- objective c中的类和对象
- 【Objective-C】06-OC对象中的self
- Objective-C 中的类和对象
- Objective-C Foundation框架中的NSObject对象
- Objective-C Foundation框架中的NSString对象
- Objective-C Foundation框架中的NSMutableString对象
- 理解Objective-C中的类与对象
- C/C++ 语言中的表达式求值
- ZOJ 2686 Cycle Game(博弈 找规律)
- autorunner
- Android ComponentName的用法
- UML——关系和图
- Objective-C中的对象复制
- 【软件工程】初识软件
- poj 1664 放苹果
- cglib动态代理介绍
- ubuntu下mysql数据库的安装和卸载
- 前端工具的浏览器调试模式
- SyntaxHighlighter使用方法
- CI框架如何删除数据
- TCP/IP链路层作用与实现过程