@property关键字
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变化。