強引用和弱引用

2021-07-11 12:53:56 字數 879 閱讀 4566

__weak 和 __strong 會出現在宣告中

預設情況下,乙個指標都會使用 __strong 屬性,表明這是乙個強引用。這意味著,只要引用存在,物件就不能被銷毀。這是一種所期望的行為:當所有(強)引用都去除時,物件才能被收集和釋放。

不過, 有時我們卻希望禁用這種行為:一些集合類不應該增加其元素的引用,因為這會引起物件無法釋放。在這種情況下,我們需要使用弱引用(不用擔心,內建的集合類 就是這麼幹的),使用 __weak 關鍵字。nshashtable 就是乙個例子。當被引用的物件消失時,弱引用會自動設定為 nil。cocoa 的 notification center 就是這麼乙個例子,雖然這已經超出純 objective-c 的語言範疇

1.(weak與strong)不同的是:當乙個物件不再有strong型別的指標指向它的時候,它就會被釋放,即使改物件還有_weak型別的指標指向它;

2.一旦最後乙個指向該物件的strong型別的指標離開,這個物件將被釋放,如果這個時候還有weak指標指向該物件,則會清除掉所有剩餘的weak指標

形象化理解: 乙個物件模擬為結婚證,釋放物件模擬為離婚.

__strong相當於結婚證,無論這兩個人感情如何,他們在在結婚證上存在牽絆,那麼他們就是夫妻,如果他們離婚,那麼他們就不再是夫妻關係.(當然,有些國家是可以一夫多妻的:d)

__weak相當於**,不管你約再怎麼約,約多少個都不能成立夫妻關係.

只要最後乙個strong型指標不再指向物件,那麼物件就會被釋放,同時所有的weak型指標都將會被清除。

在oc中strong就相當於retain屬性,而weak相當於assign。只有一種情況你需要使用weak(預設是strong),就是為了避免retain cycles(就是父類中含有  

子類,子類中又呼叫了父類,這樣都無法release)

弱引用和強引用

如果目標檔案對外部目標檔案符號進行強引用,但在鏈結成可執行檔案時不能被正確的決議 好奇怪的名稱,看看p 51 鏈結器就會報錯,這是對於強引用 strong reference 而言的。與之相對應還有一種弱引用 weak reference 在處理弱引用時,如果該符號有定義,則鏈結器將對該符號的引用進...

C 強引用和弱引用

鏈結器處理強引用和弱引用的過程幾乎是一樣的,只是對於未定義的弱引用,鏈結器不認為它是乙個錯誤,一般預設其為 0 位址為 0 或者是乙個特殊的值,以便程式 能夠識別。attribute weak extern int a printf a d n a 我們可以將它編譯成乙個可執行檔案,gcc 並不會報...

強引用和弱引用( strong和

初學者乾貨 在oc arc模式下開發 id objca nsobject alloc init 預設宣告的乙個物件就為 strong強引用,等價於 id strong objca nsobject alloc init 注 在強引用中,有時會出現迴圈引用的情況,這時就需要弱引用 weak 來幫忙 如...