iOS学习笔记

@property关键字

2019-12-11  本文已影响0人  LPL_d5fc

1.weak:

weak,弱指针,不会让引用计数器+1,如果指向对象被销毁,指针会自动置nil

weak原理:

runtime底层维护了一个弱引用表(实质是hash表),当我们创建一个用weak修饰的弱引用obj时,会先检查是否有弱引用表,若果没有就创建一个,有的话,就以引用obj的地址为key,weak指针的地址为value,存入弱引用表中。

当我们释放obj对象后,系统会根据obj的地址(key),找到弱引用表中对应的(value),即weak指针的地址,将其从弱引用表中移除。

2.assign:

一般用于修饰值类型变量,不修饰引用(对象),不会让引用计数器+1,如果指向对象被销毁指针不会被清空,会造成内存泄漏。

3.copy

(1)拷贝,复制。非为浅拷贝和深拷贝。

浅拷贝:指针复制,只复制指向对象的指针,而不复制引用对象本身。

深拷贝:内容复制,新开辟一片内存,拷贝后的对象与之前的对象互不影响。

(2)记录一下什么情况下是深拷贝什么情况下是浅拷贝:

mutableCopy,都是深拷贝。但是对于容器类来说,只是单层深拷贝。(即只是对容器进行了深拷贝操作,容器里的对象仍然是浅拷贝)

copy,对于可变对象是深拷贝,对于不可变对象是浅拷贝。

copy方法返回的就是不可变对象,mutableCopy返回的就是可变对象

容器类拷贝

非容器类拷贝

总结:判断深拷贝还是浅拷贝,只需要看 1.被拷贝的对象是否是可变的(NSMutable)  2.拷贝方法是否是可变拷贝方法(mutableCopy),只要这两点中有一点满足是可变类型,那么就是深拷贝。反之如两点都是不可变类型,那么就是浅拷贝!!!

(3)在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。

关于copy使用的引用计数相关

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

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

上一篇 下一篇

猜你喜欢

热点阅读