問:iOS 開發(fā)中經(jīng)常會用strong和weak來修飾一些屬性则拷,這兩個的區(qū)別又在哪?
就像圖片中的這樣曹鸠,A和B都要引用C對象煌茬,可是A和C之間是實線(強引用),B和C之間是虛線(弱引用)彻桃。
不論B是否還在引用C(即不論虛線是否存在)坛善,只要當(dāng)A還在引用C的時候,表明實線還在邻眷,那么C就會一直占用一塊內(nèi)存空間眠屎,不會被釋放;
但是當(dāng)A不再引用C肆饶,實線不存在了改衩,就表明沒有強指針再指向C了,這時候即使B還在引用C驯镊,虛線還存在葫督,那么C也一樣會被釋放竭鞍,不會在內(nèi)存中再占有內(nèi)存空間。
不論虛線是否存在候衍,只要實線在笼蛛,C就在洒放,實線不在蛉鹿,C在內(nèi)存中就不存在了。
(weak和strong)不同的是 當(dāng)一個對象不再有strong類型的指針指向它的時候 它會被釋放 往湿,即使還有weak型指針指向它妖异。
一旦最后一個strong型指針離去 ,這個對象將被釋放领追,所有剩余的weak型指針都將被清除他膳。
可能有個例子形容是妥當(dāng)?shù)摹?/p>
想象我們的對象是一條狗,狗想要跑掉(被釋放)绒窑。
strong型指針就像是栓住的狗棕孙。只要你用牽繩掛住狗,狗就不會跑掉些膨。如果有5個人牽著一條狗(5個strong型指針指向1個對象)蟀俊,除非5個牽繩都脫落 ,否著狗是不會跑掉的订雾。
weak型指針就像是一個小孩指著狗喊到:“看肢预!一只狗在那” 只要狗一直被栓著,小孩就能看到狗洼哎,(weak指針)會一直指向它烫映。只要狗的牽繩脫落,狗就會跑掉噩峦,不管有多少小孩在看著它锭沟。
只要最后一個strong型指針不再指向?qū)ο螅敲磳ο缶蜁会尫攀恫梗瑫r所有的weak型指針都將會被清除族淮。
_block & _weak:
在block代碼塊中也會用類似代碼來修飾變量,例如:__weak typeof(self) wself = self;
__block 為了改變block代碼塊外部的變量李请。例如:你在外面定義了一個整形變量瞧筛,想要在block塊內(nèi)改變他,那么导盅,就要用__block 來修飾這個整形變量较幌。
__weak 是為了防止循環(huán)引用,引起內(nèi)存泄露的問題白翻。
(http://blog.csdn.net/winzlee/article/details/45623905)