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] 2
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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卡杰文具密码本如果忘记密码怎么办 火狐浏览器阻止要访问的网页怎么办 点我达被永久停用了怎么办 刚下的软件点开系统显示停用怎么办 红酒洋酒啤酒一起喝胃不舒服怎么办 儿子13岁初一不想读书了怎么办 微信不小心点了注册新账号怎么办 在京东买东西商家不发货怎么办 在京东买东西坏了商家不退货怎么办 苯扎氯铵溶液不小心喝了一口怎么办 苯扎氯铵溶液没有稀释就用了怎么办 牛油果切开了但是没熟怎么办 手机安装程序时解析包出错怎么办 因俩人不合适分手了很难受怎么办 中考结束后成绩不好的该怎么办 在京东自营药房买药没有处方怎么办 平安普惠账号不可以注销怎么办? 京东购物非自营货没到降价了怎么办 实体店商家不承认卖的是假货怎么办 衣服上的装饰圆扣掉下来了怎么办 没在京东买东西却收到退款怎么办 小米分期付款买的手机不要了怎么办 唯品会在线支付后商品有问题怎么办 红米手机把时间删了怎么办 红米桌面上的时间删了怎么办 华为手机玩游戏老是闪退怎么办 别人家无线网距离太远信号差怎么办 微信公众号交话费交错了怎么办 手机卡里还有话费销户的话怎么办 号码忘记交话费变成空号怎么办 多屏互动没办法隔空播放怎么办? 一个人长期受一件事的打击怎么办 物流信息显示快递被别人签收怎么办 现在打工的人被领导骂怎么办 加密狗丢了打不开软件了怎么办 手机微信可以打开网页打不开怎么办 手机中国网打开网速慢该怎么办 在韩国用中国软件网速特别慢怎么办 淘宝退货快递一直没显示到货怎么办 高二美术生集训时文化课怎么办 唯品会不支持7天无理由退货怎么办