//联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄
一、拷贝引用计数器
浅copy,类似strong,持有原始对象的指针,会使retainCount加一。
深copy,会创建一个新的对象,不会对原始对象的retainCount变化。
二、代码实现测试
//也许你会疑问arc下如何访问retainCount属性,这里提供了两种方式(下面代码中a代表一个任意对象,这个对象最好不要是NSString和NSNumber,因为用它们进行测试会出问题)
// kvc方式
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridgeCFTypeRef)a));
//桥接字方式
NSLog(@"Retain count %@", [a valueForKey:@"retainCount"]);
三、可变和不可变
可变和不可变上文谈的不是很多,因为本文认为这完全与NSCopying和NSMutableCopying的实现息息相关。当然,对于框架类,我们可以简单的认为,copy方法返回的就是不可变对象,mutableCopy返回的就是可变对象。如果是自定义的类,就看你怎么实现NSCopying和NSMutableCopying协议了。
四、copy和block
首先,MRR时代用retain修饰block会产生崩溃,因为作为属性的block在初始化时是被存放在栈区或静态区的,如果栈区的block内调用外部变量,那么block无法保留其内存,在初始化的作用域内使用并不会有什么影响,但一旦出了block的初始化作用域,就会引起崩溃。所有MRC中使用copy修饰,将block拷贝到堆上。
其次,在ARC时代,因为ARC自动完成了对block的copy,所以修饰block用copy和strong都无所谓。
五、strong和shallowCopy
这个问题困惑了很久,最后只能得出一个结论,浅copy和strong引用的区别仅仅是浅copy多执行一步copyWithZone:方法。