IOS开发入门iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰
白羽 2019-04-16 来源 :网络 阅读 1339 评论 0

摘要:本文将带你了解IOS开发入门iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰,希望本文对大家学IOS有所帮助。


IOS开发入门iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰


大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢?
   比如:
   @property (strong,nonatomic) NSString *rStr;@property (copy,  nonatomic)   NSString *cStr;
   - (void)test {    NSMutableString *mStr =  [NSMutableStringstringWithFormat:@"abc"];    self.rStr    = mStr;    self.cStr     =  mStr;    NSLog(@"mStr:%p,%p",   mStr,&mStr);    NSLog(@"retainStr:%p,%p",  _rStr,  &_rStr);    NSLog(@"copyStr:%p,%p",    _cStr, &_cStr);}
   假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123;  当把mStr赋值给retain的rStr时,rStr对象的地址为0x11,rStr变量自身在内存中的地址为0x124;rStr与mStr指向同样的地址,他们指向的是同一个对象@“abc”,这个对象的地址为0x11,所以他们的值是一样的。  当把mStr赋值给copy的cStr时,cStr对象的地址为0x22,cStr变量自身在内存中的地址0x125;cStr与mStr指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0x22,值为@“abc”。
   如果现在改变mStr的值:
   ?123[mStr appendString:@"de"];NSLog(@"retainStr:%@",   _rStr);NSLog(@"copyStr:%@",    _cStr);
   结果,
   使用retain的字串rStr的值:@”abcde”,
   而使用copy的字串cStr的值:@”abc”,  所以,如果一般情况下,我们都不希望字串的值跟着mStr变化,所以我们一般用copy来设置string的属性。  如果希望字串的值跟着赋值的字串的值变化,可以使用strong,retain。  注意:上面的情况是针对于当把NSMutableString赋值给NSString的时候,才会有不同,如果是赋值是NSString对象,那么使用copy还是strong,结果都是一样的,因为NSString对象根本就不能改变自身的值,他是不可变的。
   把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。
   由此可以看出:
   对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。
   对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。
   另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。
   其实说白了,对字符串为啥要用这两种方式?我觉得还是一个安全问题,比如声明的一个NSString *str变量,然后把一个NSMutableString  *mStr变量的赋值给它了,如果要求str跟着mStr变化,那么就用retain;如果str不能跟着mStr一起变化,那就用copy。而对于要把NSString类型的字符串赋值给str,那两都没啥区别。不会影响安全性,内存管理也一样。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程