OC copy内存管理语义及 copy mutableCopy

1.copy内存管理语义

A:copy 相对 strong对属性(string array dictionarry)的修饰,区别在于如果传过来的是一个mutable,strong修饰的指针内容会受到外部修改而影响,而内部默认无感知;copy则会重新alloc拷贝一份,而对于传过来的是inmutable的处理方式一致,都是增减引用计数。

B:定义block的时候,其定义的内存是分配在栈中的,其在定义block的范围内有效,当对象存在block属性一般用copy内存管理语义,拷贝到堆区,也就相当于存在引用计数概念了,后续的复制只会增加引用计数。


备注:

(1)

[NSString copy]               指针复制,返回的对象的地址和方法的接收者一样,引用计数加1
[NSMutableString copy]        深复制,重新Alloc一个 NSString 的对象,并返回。返回对象的地址和方法接收者的地址不一样,并且方法接受者的内容改变不影响返回对象,同时返回对象的内容不可以改变。

(2)

[NSString mutableCopy]        深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。
[NSMutableString mutableCopy]  深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。

(3)

对于数组、集合等容器讲虽然做了深复制,但是内部元素地址还是浅拷贝,比如一个人的朋友圈集合的复制,所以要实现深拷贝就要对象去实现NSCopying协议,或者提供一个 deepCopy方法。


对象调用了copy方法,而copy方法最终会要求调用类方法copyWithZone:, 而NSObject本身并没有实现这个类方法, 这个方法是放在NSCopying协议中的,自定义对象调用copy需要实现协议。


猜你喜欢

转载自blog.csdn.net/li198847/article/details/70239420