天天看點

objective-c中property 的屬性strong,weak, retain, copy

(weak和strong)不同的是 當一個對象不再有strong類型的指針指向它的時候 它會被釋放  ,即使還有weak型指針指向它。

一旦最後一個strong型指針離去 ,這個對象将被釋放,所有剩餘的weak型指針都将被清除。

可能有個例子形容是妥當的。

想象我們的對象是一條狗,狗想要跑掉(被釋放)。

strong型指針就像是栓住的狗。隻要你用牽繩挂住狗,狗就不會跑掉。如果有5個人牽着一條狗(5個strong型指針指向1個對象),除非5個牽繩都脫落 ,否着狗是不會跑掉的。

weak型指針就像是一個小孩指着狗喊到:“看!一隻狗在那” 隻要狗一直被栓着,小孩就能看到狗,(weak指針)會一直指向它。隻要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看着它。

隻要最後一個strong型指針不再指向對象,那麼對象就會被釋放,同時所有的weak型指針都将會被清除。

copy: 建立一個引用計數為1的對象,然後釋放舊的對象

retain:釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的引用計數為 1

Copy其實是建立了一個相同的對象,而retain不是:

比如一個NSString對象,位址為0×1111,内容為@”STR”

Copy到另外一個NSString之 後,位址為0×2222,内容相同,新的對象retain為1, 舊有對象沒有變化

retain到另外一個NSString之 後,位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的retain值+1

也就是說,retain是指針拷貝,copy是内容拷貝。在拷貝之前,都會釋放舊的對象。

1、使用copy: 對NSString

2、使用retain: 對其他NSObject和其子類

strong與weak是由ARC新引入的對象變量屬性

ARC引入了新的對象的新生命周期限定,即零弱引用。如果零弱引用指向的對象被deallocated的話,零弱引用的對象會被自動設定為nil。

@property(strong) MyClass *myObject;

相當于@property(retain) MyClass *myObject;

@property(weak) MyOtherClass *delegate;

相當于@property(assign) MyOtherClass *delegate;

強引用與弱引用的廣義差別:

強引用也就是我們通常所講的引用,其存亡直接決定了所指對象的存亡。如果不存在指向一個對象的引用,并且此對象不再顯示清單中,則此對象會被從記憶體中釋放。

弱引用除了不決定對象的存亡外,其他與強引用相同。即使一個對象被持有無數個若引用,隻要沒有強引用指向他,那麽其還是會被清除。

簡單講strong等同retain

weak比assign多了一個功能,當對象消失後自動把指針變成nil,好處不言而喻。

__weak, __strong 用來修飾變量,此外還有 __unsafe_unretained, __autoreleasing 都是用來修飾變量的。

__strong 是預設的關鍵詞。

__weak 聲明了一個可以自動 nil 化的弱引用。

__unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的記憶體區域被釋放了,這個指針就是一個野指針了。

__autoreleasing 用來修飾一個函數的參數,這個參數會在函數傳回的時候被自動釋放。