2013-01-22 73 views
9

在Objective-C,我知道,一個靜態變量(應該?)保持其價值的程序的生命週期。但是如果它存儲了一個指針,它在ARC中算作爲?我可以依靠它,放心,這些實例將永遠去堆出來的,一旦我分配到一個靜態變量?靜態指針是一個強指針嗎?

static ClassA* shared; 

-(id)init 
{ 
    if (self=[super init]) { 
     shared=self; 
    } 
    return self; 
} 

回答

14

是的,你可以依靠它,一旦它被分配。

Transitioning to ARC Release Notes狀態:在ARC

,強是對象類型的缺省值。

然後:

__strong是默認的。只要有一個強有力的指針,一個對象仍然是「活着的」。

鑑於您的static指針引用該對象,它將保持「活着」狀態。指針的作用域(無論是全局的,棧上的指針還是實例變量)都沒有區別。

+0

實際上,我用這個靜態指針作爲一個全球性的指針爲我的項目的一部分,(我知道全局變量是邪惡的,但是......);如果它留在堆中,一旦我不再需要它,我怎麼能擺脫它?理想情況下,ARC應該照顧這一點,就好像沒有使用這個變量的代碼那麼它會得到處理;但隨後似乎這種靜態變量會搞亂了一切 – lynnard

+0

@ yulan6248'nil'變量,當你不再需要它。 – JustSid

0

看起來你應該只執行一個Singleton,然後你可以通過實例設置爲nil,擺脫它。

+0

但是,如果靜態指針是一個強大的指針,是不是表示我只能在單例類本身中將它忽略?所以我必須爲此專門做一個方法.. – lynnard

+0

如果您使用的是ARC,您並不真正在意收集。如果你零,它使用的內存將被回收,對吧? – Rob

+1

我覺得我很困惑。如果靜態變量是一個強指針,那麼我需要將它設置爲零以使ARC正確解除分配;但由於靜態變量只對單例類是可見的,所以我不得不在單例類中刪除它......或者我錯了嗎? – lynnard