是不是沒有必要保留一個靜態變量,因爲它在程序期間保持不變,無論是否釋放它?爲什麼要保留一個靜態變量?
回答
我假設你的意思是一個靜態對象的指針,如static NSString *foobar;
。
這樣的變量的確有一個使用期限,只要應用程序,但我們討論的變量是指針只有。在Objective-C中,對象總是動態分配的,所以我們總是用指向它們類型的指針來處理它們,但是對象的底層數據仍然存在於動態分配的野生藍色方向中。
您仍然必須保留該對象,因爲儘管指向的指針永遠不會超出範圍,但對象本身可以像任何其他對象一樣被釋放,因此指針最終會指向垃圾,或更糟的是,另一個無關的對象。
喬納森Grynspan的接受的答案的簡化版本:
retain
的不是爲可變指向的對象。該變量將永遠持續下去,因爲它是靜態的。 retain
用於變量指向的對象。沒有retain
的對象可以(並應該)被釋放。然後你有一個變量指向一個會導致sigabrt
的事情。這個指向無處的變量被稱爲「懸掛指針」。
對於ARC背景下,做的最好的事情就是將靜態變量聲明爲強,所以是這樣的:
static ThatClass * __strong thatStaticVariable;
這確保了對象thatStaticVariable
指向將是一個有效的對象(即,永遠不會被釋放)。 但是,你實際上並不需要__strong關鍵字可言,因爲它是默認的(所以sayeth the docs,感謝@zpasternack),因此就使用
static ThatClass *thatStaticVariable;
,你是好。
注意:永遠=當應用程序運行時
在ARC下,任何沒有顯式所有權限定符的可保留對象都隱含地爲__strong,所以請說明[docs](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference)。 – zpasternack 2012-02-12 03:09:02
- 1. 爲什麼NSString變量需要保留?
- 2. 爲什麼一個變量不需要類型的靜態塊
- 3. 爲什麼這個變量需要是靜態的?
- 4. 變量「с」變成靜態的嗎?爲什麼「c」被保存?
- 5. 爲什麼__weak限定符的變量保留一個對象?
- 6. 爲什麼我需要保留一個指向我的QWidget的變量?
- 7. 爲什麼靜態變量不好?
- 8. 你爲什麼要初始化一個C++靜態成員變量?
- 9. 靜態變量和靜態變量的區別是什麼?
- 10. jUnit重置變量或保留靜態變量
- 11. 爲什麼靜態變量需要在C++中聲明兩次
- 12. 爲什麼要在結構中初始化const靜態變量?
- 13. 爲什麼要使用System.Runtime.Caching或System.Web.Caching Vs靜態變量?
- 14. 爲什麼我的保留計數爲11個變量的inputString?
- 15. 爲什麼Forth每個變量保留兩個單元格?
- 16. 爲什麼不是這個靜態c#變量改變?
- 17. 爲什麼不設置一個靜態變量來消除靜態變量的目的?
- 18. 是什麼讓一個靜態變量只初始化一次?
- 19. 聲明靜態變量時的輸出是什麼?爲什麼?
- 20. PHP:引用靜態變量中的另一個靜態變量
- 21. 試圖訪問另一個靜態變量的靜態變量
- 22. 爲什麼這個非靜態變量通過函數調用保持其值?
- 23. 靜態變量不需要
- 24. 爲什麼不聲明每個變量都是靜態的
- 25. 什麼是我需要使用的保留變量服務器?
- 26. 爲什麼不調用一個靜態變量鏈接的靜態方法返回null拋出一個NPE?
- 27. 什麼時候一個靜態變量是真正初始化
- 28. 什麼是靜態方法和變量?
- 29. 爲什麼第二個靜態變量賦值不是第一個生效的?
- 30. 在java中添加一個靜態變量和一個非靜態變量
喬納森是對的!如果參數傳遞是在autorelease池中,並且在方法被調用後會自動釋放? - >訪問靜態指針將導致失敗(主要是EXEC_BAD_ACCESS) – 2011-06-11 15:31:19
Martin,一個小的更正:這是EXC_BAD_ACCESS(EXC異常)。 – bneely 2012-02-12 02:24:53
感謝您的明確解釋 – Stavash 2014-04-02 08:58:14