最近和朋友讨论了修饰变量的关键字的用法,发现需要总结一下,面试也会有这些问题.在iOS开发中定义@property属性时,经常用到assign、weak、retain、strong、copy等关键字。
先说下weak 和strong
(ARC下的strong等同于MRC下的retain都会把对象引用计数加1),一个是强引用,一个是弱引用.区别是一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。只有当一个对象的引用计数等于零时才释放,weak不加引用计数.在网上看到别人写的有趣的例子形象的描述了这种关系:
strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。
weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
然后是copy
copy用来修饰nsstring,这里需要说一下,我以前犯过的一个错误,使用strong来修饰NSString,如果只是简单地使用的话还是没问题的,这里涉及到了一个浅Copy和深Copy的问题,和上面的强引用和弱引用不一样,这里说的浅Copy:可以理解为指针的复制,只是多了一个指向这块内存的指针,共用一块内存。
深Copy:理解为内存的复制,两块内存是完全不同的,也就是两个对象指针分别指向不同的内存,互不干涉.
如果对不可变的对象进行调用或者引用时,copy和strong都是一样的,都是浅copy,这样看来,在不可变对象之间进行转换,strong与copy作用是一样的.但是如果在不可变与可变之间进行操作,那么楼主比较推荐copy,这也就是为什么很多地方用copy,而不是strong修饰NSString,NSArray等存在可变不可变之分的类对象了,这时会导致strong修饰的变量是浅copy,改变变量会同时改变原有不可变变量,而由copy修饰的字符串进行了深Copy,所以而mutableCopy和stringCopy指向的是完全两块不同的内存。不会有连带修改