最近和朋友討論了修飾變量的關鍵字的用法,發現需要總結一下,面試也會有這些問題.在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指向的是完全兩塊不同的內存。不會有連帶修改