retain、strong、weak、assign區別
阿新 • • 發佈:2019-01-09
在網上看到一個解釋weak和strong的例子,感覺挺形象的,如下: 一、weak和strong的區別 (weak和strong)不同的是 當一個物件不再有strong型別的指標指向它的時候 它會被釋放 ,即使還有weak型指標指向它。 一旦最後一個strong型指標離去 ,這個物件將被釋放,所有剩餘的weak型指標都將被清除。 可能有個例子形容是妥當的。 想象我們的物件是一條狗,狗想要跑掉(被釋放)。 strong型指標就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指標指向1個物件),除非5個牽繩都脫落 ,否著狗是不會跑掉的。 weak型指標就像是一個小孩指著狗喊到:“看!一隻狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指標)會一直指向它。只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。 只要最後一個strong型指標不再指向物件,那麼物件就會被釋放,同時所有的weak型指標都將會被清除。 二、weak和assign的區別 1、assign是指標賦值,不對引用計數操作,使用之後如果沒有置為nil,可能就會產生野指標;而weak一旦不進行使用後,永遠不會使用了,就不會產生野指標! 三、 alloc 物件分配後引用計數為1 retain 物件的引用計數+1 copy copy 一個物件變成新的物件(新記憶體地址) 引用計數為1 原來物件計數不變 release 物件引用計數-1 如果為0釋放記憶體 autorelease 物件引用計數-1 如果為0不馬上釋放,最近一個個pool時釋放 四、
strong 和weak
iOS 5 中對屬性的設定新增了strong 和weak關鍵字來修飾屬性(iOS 5之前不支援ARC)
strong 用來修飾強引用的屬性;
@property (strong) SomeClass * aObject; 對應原來的 @property (retain) SomeClass * aObject; 和 @property (copy)SomeClass * aObject; weak 用來修飾弱引用的屬性; @property (weak) SomeClass * aObject; 對應原來的 @property (assign) SomeClass * aObject;