最近和朋友討論了修飾變量的關(guān)鍵字的用法,發(fā)現(xiàn)需要總結(jié)一下,面試也會有這些問題.在iOS開發(fā)中定義@property屬性時剩晴,經(jīng)常用到assign侵状、weak、retain绽左、strong艇潭、copy等關(guān)鍵字。
先說下weak 和strong
(ARC下的strong等同于MRC下的retain都會把對象引用計數(shù)加1),一個是強引用,一個是弱引用.區(qū)別是一個對象不再有strong類型的指針指向它的時候 它會被釋放? 暴区,即使還有weak型指針指向它辛臊。只有當(dāng)一個對象的引用計數(shù)等于零時才釋放,weak不加引用計數(shù).在網(wǎng)上看到別人寫的有趣的例子形象的描述了這種關(guān)系:
strong型指針就像是栓住的狗。只要你用牽繩掛住狗伐割,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指針指向1個對象)隔心,除非5個牽繩都脫落 硬霍,否著狗是不會跑掉的。
weak型指針就像是一個小孩指著狗喊到:“看唯卖!一只狗在那” 只要狗一直被栓著,小孩就能看到狗抽减,(weak指針)會一直指向它橄碾。只要狗的牽繩脫落,狗就會跑掉法牲,不管有多少小孩在看著它。
然后是copy
copy用來修飾nsstring,這里需要說一下,我以前犯過的一個錯誤,使用strong來修飾NSString,如果只是簡單地使用的話還是沒問題的,這里涉及到了一個淺Copy和深Copy的問題,和上面的強引用和弱引用不一樣,這里說的淺Copy:可以理解為指針的復(fù)制淹办,只是多了一個指向這塊內(nèi)存的指針恶复,共用一塊內(nèi)存怜森。
深Copy:理解為內(nèi)存的復(fù)制谤牡,兩塊內(nèi)存是完全不同的,也就是兩個對象指針分別指向不同的內(nèi)存恐疲,互不干涉.
如果對不可變的對象進行調(diào)用或者引用時,copy和strong都是一樣的,都是淺copy,這樣看來套么,在不可變對象之間進行轉(zhuǎn)換,strong與copy作用是一樣的.但是如果在不可變與可變之間進行操作胚泌,那么樓主比較推薦copy,這也就是為什么很多地方用copy,而不是strong修飾NSString,NSArray等存在可變不可變之分的類對象了,這時會導(dǎo)致strong修飾的變量是淺copy,改變變量會同時改變原有不可變變量,而由copy修飾的字符串進行了深Copy,所以而mutableCopy和stringCopy指向的是完全兩塊不同的內(nèi)存零蓉。不會有連帶修改