2011-06-11 78 views

回答

36

我假設你的意思是一個靜態對象的指針,如static NSString *foobar;

這樣的變量的確有一個使用期限,只要應用程序,但我們討論的變量是指針只有。在Objective-C中,對象總是動態分配的,所以我們總是用指向它們類型的指針來處理它們,但是對象的底層數據仍然存在於動態分配的野生藍色方向中。

您仍然必須保留該對象,因爲儘管指向的指針永遠不會超出範圍,但對象本身可以像任何其他對象一樣被釋放,因此指針最終會指向垃圾,或更糟的是,另一個無關的對象。

+4

喬納森是對的!如果參數傳遞是在autorelease池中,並且在方法被調用後會自動釋放? - >訪問靜態指針將導致失敗(主要是EXEC_BAD_ACCESS) – 2011-06-11 15:31:19

+0

Martin,一個小的更正:這是EXC_BAD_ACCESS(EXC異常)。 – bneely 2012-02-12 02:24:53

+0

感謝您的明確解釋 – Stavash 2014-04-02 08:58:14

16

喬納森Grynspan的接受的答案的簡化版本:

retain的不是爲可變指向的對象。該變量永遠持續下去,因爲它是靜態的。 retain用於變量指向的對象。沒有retain的對象可以(並應該)被釋放。然後你有一個變量指向一個會導致sigabrt的事情。這個指向無處的變量被稱爲「懸掛指針」。

對於ARC背景下,做的最好的事情就是將靜態變量聲明爲強,所以是這樣的:

static ThatClass * __strong thatStaticVariable; 

這確保了對象thatStaticVariable指向將是一個有效的對象(即,永遠不會被釋放)。 但是,你實際上並不需要__strong關鍵字可言,因爲它是默認的(所以sayeth the docs,感謝@zpasternack),因此就使用

static ThatClass *thatStaticVariable; 

,你是好。

注意:永遠=當應用程序運行時

+5

在ARC下,任何沒有顯式所有權限定符的可保留對象都隱含地爲__strong,所以請說明[docs](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference)。 – zpasternack 2012-02-12 03:09:02

相關問題