关于NSString中的copy与strong

本文探讨了在Objective-C编程中,对于NSString和NSMutableString类型的属性,使用copy与strong关键字的不同效果。当字符串为不可变类型时,两者操作相似;而当字符串可变时,copy会产生一个新的对象副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们的编程过程中,我们通常会定义很多属性。那么问题来了,在定义属性的时候, 我们是需要用copy还是用strong。

下面以NSString为例,在我们通常的定义中。我们会定义NSString和NSMutableString两种类型。在NSString模式下,因为其性质为不可变的字符串,所以,不论copy还是NSString修饰的属性的对象指向的都是同一个地址。即,NSString指向的地址。假如,在MRC的模式下,打印NSString的计数情况,我们就会清楚的看到,NSString的计数为3。也就是说不论是strong操作还是copy操作的作用都是是NSString的引用计数值加一。

当我们把NSString改变为NSMutableString类型时,在MRC的模式下打印NSString的计数情况,发现引用计数的值变为2。而通过copy操作的引用计数的值为1。也就是说,通过strong操作,指向的是NSMutableString的地址,当NSMutableString值改变的时候,通过strong操作的值,也会跟着改变。但是,copy操作是对NSMutableString的值进行了一次深拷贝,不论NSMutableString的值如何改变都不会影响到copy操作的值。

由此可知,当字符串为NSString类型时,由于字符是不可变的。所以,通过copy和strong操作的值,都是指向NSString的地址,copy操作相当于做了一次先拷贝(伪拷贝)。当字符串为NSMutableString类型时,strong的操作仅仅使引用计数加一,copy操作是对字符串进行一次深拷贝,产生了一个新的对象,copy的属性指向这个新对象的地址。copy属性的对象的类型始终是NSString,所以它是不可变的。

在使用copy和strong时,我们还要从其性能方面进行考虑。当字符串为NSMutableString时,strong操作只是使引用计数加一,而copy操作是进行了一次深拷贝。所以,性能肯定会有差距。当然,NSString类型不存在这种情况。

综上所述,在定义NSString属性时使用copy还是strong根据自己的实际情况来判断。但是,我建议大部分时候使用copy,可以为我们提供更强的保护性。防止因为字符串的修改而发生不可预计的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值