前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么NSString要用Copy来修饰?

为什么NSString要用Copy来修饰?

作者头像
用户1451823
发布2018-09-13 16:06:59
5740
发布2018-09-13 16:06:59
举报
文章被收录于专栏:DannyHoo的专栏DannyHoo的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337880

关于NSString要用Copy来修饰这个问题,我不多说只是摆出代码:

// 深复制

Person * xiaoMing = [Personallocinit];

NSMutableString * name = [NSMutableStringallocinitWithString:@"xiaoming"];

//    name.string = @"xiaoming";

    xiaoMing.name = name;

NSLog(@"%@", xiaoMing.name);

    name appendString:@"hah";

// 此时名字这个属性被修改了

NSLog(@"%@", xiaoMing.name);

如果用Copy来修饰name这个属性不会改变,如果使用Strong,当name这个字符串改变的时候,name这个属性也会随着改变。

xiaoMing.name = name;(此时name是用copy修饰的)    等同于  xiaoMing.name = name copy;(copy对可变对象进行的是深拷贝,此时是拷贝出了一个新的对象然后赋值给了xiaoMing.name   mutableCopy对所有的对象进行的都是深拷贝)

补充:这其实也是看需求,看被赋值的字符串是否需要随着赋值字符串的变化而变化,而大多数情况下我们不希望被赋值的字符串如某个对象的某个字符串类型的属性会随着赋值字符串的变化而变化。  反之,如果我们希望被赋值的字符串随着赋值字符串的变化而变化,那么我们也可以使用strong来修饰字符串(赋值字符串和被赋值字符串说的好像挺绕口啊)。注:赋值字符串既然可变,那它就必然是可变字符串。

至于其底层原理区别则是两种修饰方式让指针指向的内存地址不同。使用copy修饰被赋值字符串,被修饰字符串会对赋值字符串(可变字符串)进行一次深拷贝,那么被赋值字符串和赋值字符串指向的是完全不同的两块内存地址,反之两者指向的同一块内存地址。

当我们确定赋值字符串是不可变字符串的时候我们是可以使用strong来修饰字符串。

联想:由copy修饰字符串想到的用strong修饰数组,原理是一样的,当我们用strong来修饰不可变数组的时候,如果赋值数组是可变数组,那么被赋值数组同样会随着可变数组的变化而变化。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年08月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档