iOS copy相关

本文详细解释了copy与retain的区别,包括它们如何处理字符串和自定义对象。探讨了copy与retain在处理NSMutableString与NSString之间的相互作用,以及为什么字符串通常使用copy而非retain。此外,还讨论了Block作为属性时使用copy的原因。

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

copy与retain的区别:

  1. copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retainCount为1,与旧有对象的引用计数无关,旧有对象没有变化,copy减少对象对上下文的依赖.

  2. retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retainCount值+1也就是说,retain 是指针拷贝,copy 是内容拷贝

字符串为什么要用Copy

假如有一个NSMutableString,现在用他给一个retain修饰的NSString赋值,那么只是将NSString指向了NSMutableString所指向的位置,并对NSMutbaleString计数器加一,此时,如果对NSMutableString进行修改,也会导致NSString的值修改,原则上这是不允许的.

如果是copy修饰的NSString对象,在用NSMutableString给他赋值时,会进行深拷贝,及把内容也给拷贝了一份,两者指向不同的位置,即使改变了NSMutableString的值,NSString的值也不会改变.所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的

自定义对象的拷贝

自定义对象如果要浅拷贝就遵守协议 (copy)

自定义对象如果要深拷贝就遵守协议 (mutableCopy)

自定义对象遵守了相关协议,就能够调用相应的深拷贝或者浅拷贝的方法

Block定义成属性为什么用Copy

MRC : Block的本质是函数指针,内存地址在栈区,使用Copy是为了把Block由栈区拷贝到堆区,共享给当前对象使用.

ARC : Block定义成属性时,使用strong和copy的效果是一样,但是苹果官方建议使用copy.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值