ios copy和copy strong 区别的区别

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
NSString 使用 copy 关键字和 strong 关键字修饰的异同
摘要:NSString为什么要用copy关键字,如果用strong会有什么问题?当然,这里没有说用strong就一定不行,使用copy和strong是看情况而定的。网上也有很多文章是解释这一点的,但都不够形象清晰,博主的博客风格是力求简单易懂,尽量用实例来说明问题。不说太多废话,用最简单的例子来说明问题,直接上代码和运行截图:通过上面的例子可以看出,当使用strong修饰NSString时,我们在没有直接修改self.name的情况下self.name却被修改了,就好像一个人的名字
NSString 为什么要用 copy 关键字,如果用 strong 会有什么问题?当然,这里没有说用 strong 就一定不行,使用 copy 和 strong 是看情况而定的。网上也有很多文章是解释这一点的,但都不够形象清晰,博主的博客风格是力求简单易懂,尽量用实例来说明问题。
不说太多废话,用最简单的例子来说明问题,直接上代码和运行截图:
通过上面的例子可以看出,当使用 strong 修饰 NSString 时,我们在没有直接修改 self.name 的情况下 self.name 却被修改了,就好像一个人的名字没有经过同意就被修改了,我们的初衷只是单纯地修改 str1,但是 self.name 却被意外修改了,而这就是使用 strong 所不想看到的结果,会破坏程序的封装性。
说明:使用 strong 后 self.name 和 str1 指向的是同一片内存区域,所以修改其中一个值后两个值就都变了。
而当使用 copy 修饰 NSString 时,str2 通过 copy 得到了一个新的对象赋值给 self.name,这样我们再修改 str2 的值就跟 self.name 没关系了,只有直接对 self.name 进行赋值才能改变它的值,这样也就保证了程序的封装性。
本文只是对NSString 使用 copy 关键字和 strong 关键字修饰的异同做一个简单的总结和分享,更深入了解还需学习浅拷贝与深拷贝相关知识,后续博文会陆续更新!
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
NSString 使用 copy 关键字和 strong 关键字修饰的异同相关信息,包括
的信息,所有NSString 使用 copy 关键字和 strong 关键字修饰的异同相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
资源和社区
关注阿里云
International在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在iOS里@property一个block的时候,我们应该使用strong还是copy呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
MRC 下用 copy,ARC 下都可以。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。iOS之property里的copy、strong区别 - 简书
iOS之property里的copy、strong区别
讲述了深拷贝和浅拷贝,就容易理解property里的copy、strong了
#import &Foundation/Foundation.h&
@interface ZJPerson : NSObject
@property (nonatomic,copy) NSString *
@property (nonatomic,strong) NSString * StrongN
测试如下:
NSMutableString * name = [NSMutableString stringWithFormat:@"iOS俱哥"];
ZJPerson * p = [[ZJPerson alloc]init];
p.StrongName =
// 不能改变p.name的值,因为其内部copy新的对象
//改变了p.StrongName的值,因为StrongName和name指向了同一块内存
[name appendString:@"!!!"];
NSLog(@"p.name = %@",p.name);
NSLog(@"p.StrongName = %@",p.StrongName);
NSLog(@"name:%p,p.name:%p,p.StrongName:%p",name,p.name,p.StrongName);
注:在strong情况下,如果外部被引用的变量更改了,那里面这个值也会更改,因为两个属性指向同一块内存空间 。在这里strong 属于浅拷贝,只赋值对象的指针。
为了防止外界修改name,就用copy,因为copy是生成了一份新的内存空间,,所以外界是不能修改值。
在这里给出一道常见面试题,看了上述的讲解,这道题就能很好地理解了:
用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
答:用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。
如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。
github地址:https://github.com/zhengju
索引风格纠错题优化部分硬伤部分 什么情况使用 weak 关键字,相比 assign 有什么不同?怎么用 copy 关键字?这个写法会出什么问题: @property (copy) NSMutableArray *如何让自己的类用 copy 修饰符?如何重写带 c...
1.什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引用一...
《招聘一个靠谱的 iOS》—参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:《招聘一个靠谱的 iOS》,其中共55题,除第一题为纠错题外,其他54道均为简答题。 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开...
什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引用一次,...
说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:《招聘一个靠谱的 iOS》,其中共55题,除第一题为纠错题外,其他54道均为简答题。 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开发工作,对技术喜欢刨根问底和总结最佳实践,热...
今早起床,感觉空气清新了不少,深深吸一口,开始一天忙碌的生活。我们所有队员都是7点半准时从学校南苑北门出发,赶往紫荆山公园,然后沐浴着晨光,闻着大地的清新,说说笑笑不大一会我们就来到紫荆山公园大门口,因为我是第一次来,刚一到门口就感觉好壮观,但我知道,这不是我来此的目的,我...
在互联网时代,我们有机会低成本的链接几千、几万乃至更多的人。那么,我们要如何经营这些关系,使之不流于表面,达成高质量的社交呢? 首先,我们要知道,人的精力、时间是有限的,在一个阶段,能深度交往的往往就那么十几、二十个人。想要达成高质量社交,就要与牛人相...
一个人坐在寝室,准备听听歌的,一时不知道听什么,突然想听马头琴曲了,随后就点开网页,搜了马头琴民曲就在听,听着听着,情绪上来了,觉得必须要写了写。 半年没有听到马头琴的声音了,琴就在寝室放着,也没有拉了。大一的时候拉过,后来发现太吵了,声音太大,随后去琴房也拉过,但是还是挺...
这个世界上从来没有绝对的唯一真理,只有你自己的真理。你相信的,你遵从的,就是你的真理,你的真理不是我的真理,我的真理也不是你的真理。你的真理可能对我没有用,我的真理可能对你也没有帮助。 真理有很多的层次,就好比说世界有无限多个维次,n维的宇宙,n维的真理,重重无尽,穿越不止...
人以群分。 好消息是:群内,字字投机。 坏消息是:群外,半句都多。 他:我跟你说啊, 。。。。。。。。。。。。 我:什么意思? 他:就是 。。。。。。。。。 我:大哥,我没听懂。啥意思? 。。。。。。。。。。 他:把电话挂了吧。咱俩之间,差了不止10个Siri,没法沟通。 ...80被浏览19,203分享邀请回答12添加评论分享收藏感谢收起7添加评论分享收藏感谢收起& copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象。
& assign:& 简单的直接赋值,相当于说两个对象指向同个内存区,一个地方的变了,其他的也跟着改变。
& retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数 为1
那上面的是什么意思呢?
Copy 其实是建立了一个相同的对象,而 retain 不是:
比如一个 NSString 对象,地址为 0&1111,内容为@&ABC&
Copy 到另外一个 NSString 之 后,地址为 0&2222,内容相同,新的对象 retain 为 1, 旧 有对象没有变化
retain 到另外一个 NSString 之 后,地址相同(建立一个指针,指针拷贝),内容当然相 同,这个对象的 retain 值+1
assign 地址还是0x1111,内容也还是&ABC&。
1.strong :除NSString\block以外的OC对象
& & & @property(nonatomic,strong) NSArray& *&#model#&;
2.weak:各种UI控件(但不是绝对,也有控件要使用strong属性的,但是xib中必须使用weak,因为控件被拖进xib的时候就被strong修饰了)
& & & @property (nonatomic,weak) UIButton *
3.assign:CGFloat,NSInteger等基本数据类型、枚举、结构体(非OC对象)
& & &@property(nonatomic,assign) CGFloat &#model#&;
& & &1. copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)
& & &2. &mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
& & &3. @property(nonatomic,copy)NSString *&#model#&;
&@property内存管理策略的选择
& 1& copy : 只用于NSString\block
& 2& retain : 除NSString\block以外的OC对象
& 3& assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign
& 1& copy : 只用于NSString\block
& 2& strong : 除NSString\block以外的OC对象
& 3& weak : 当2个对象相互引用,一端用strong,一端用weak
& 4& assgin : 基本数据类型、枚举、结构体(非OC对象)
文/zhengleBaby(简书作者)原文链接:http://www.jianshu.com/p/97c49a57f455著作权归作者所有,转载请联系作者获得授权,并标注&简书作者&。
阅读(...) 评论()

我要回帖

更多关于 ios copy strong 的文章

 

随机推荐