iOS 内存管理~深浅拷贝~引用计数器

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄

一、拷贝引用计数器

copy,类似strong,持有原始对象的指针,会使retainCount加一。

copy,会创建一个新的对象,不会对原始对象的retainCount变化。


二、代码实现测试

// 也许你会疑问arc下如何访问retainCount属性,这里提供了两种方式(下面代码中a代表一个任意对象,这个对象最好不要是NSStringNSNumber,因为用它们进行测试会出问题)

// kvc方式

NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));

// 桥接字方式

NSLog(@"Retain count %@", [a valueForKey:@"retainCount"]);


、可变和不可变


可变和不可变上文谈的不是很多,因为本文认为这完全与NSCopyingNSMutableCopying的实现息息相关。当然,对于框架类,我们可以简单的认为,copy方法返回的就是不可变对象,mutableCopy返回的就是可变对象。如果是自定义的类,就看你怎么实现NSCopyingNSMutableCopying协议了。


copyblock


首先,MRR时代用retain修饰block会产生崩溃,因为作为属性的block在初始化时是被存放在栈区或静态区的,如果栈区的block内调用外部变量,那么block无法保留其内存,在初始化的作用域内使用并不会有什么影响,但一旦出了block的初始化作用域,就会引起崩溃。所有MRC中使用copy修饰,将block拷贝到堆上。

其次,在ARC时代,因为ARC自动完成了对blockcopy,所以修饰blockcopystrong都无所谓。


strongshallowCopy


这个问题困惑了很久,最后只能得出一个结论,浅copystrong引用的区别仅仅是浅copy多执行一步copyWithZone:方法。


谢谢!!!

你可能感兴趣的:(ios,内存管理,iOS,原理集合)