2010-03-10 65 views
0

任何人都可以告訴我什麼下面的類中的靜態變量的範圍是?類中的靜態變量作用域?

@implementation SharedManager 

static id myInstance = nil; 

+(id)sharedInstance { 
    if(myInstance == nil) { 
     myInstance = [[self alloc] init]; 
    } 
    return myInstance; 
} 

在測試我創建從類的實例,然後釋放它,但注意到,在創建第二個實例,靜態不是零(即指向先前發佈的對象)對於測試我固定這通過覆蓋 - (void)dealloc爲這個類。

-(void)dealloc { 
    NSLog(@」_deal: %@」, [self class]); 
    [super release] 
    myInstance = nil 
} 

加里

回答

1

該變量的範圍僅限於「SharedManager」類本身(因爲它在@implementation部分中聲明,它對子類不可見)。

該變量的持續時間是「靜態」,這意味着有一個與該類本身相關的變量副本;當你分配/ dealloc類的實例時它不會被創建/銷燬。

另外;如果你的類意圖是線程安全的,你應該做的

@synchronized(self) { 
if (myInstance == nil) { 
    myInstance = [[self alloc] init]; 
} 

您sharedInstance方法,來處理兩個線程同時調用sharedInstance的情況。

+0

謝謝大衛,是的,我明白這一點,但在這種情況下,單例只是模型數據,它是一個簡單的MVC iPhone應用程序,我不會預見和線程發生。我只是想確定它是如何工作的,因此不需要dealloc,因爲我沒有看到它被釋放 – fuzzygoat 2010-03-10 17:24:27

+0

只是我的單身旅行中的一個快速記錄,@synchronized([SharedManager class]){可能會更好,或者更好我被引導相信。 – fuzzygoat 2010-03-10 17:43:47

0

據我瞭解,該變量的可見度範圍是其當前的源文件中的聲明下方,且壽命是全球性的。就好像它是一個C靜態變量。

在其他消息中,您可以在@implementation塊中編寫C函數 - 它們將像常規C函數一樣工作。

ObjC,AFAIK中沒有「類靜態」變量的概念。這不是C++。

+0

謝謝,不知道「C函數」位,代碼顯示「Objective-C類方法」......但我總是可能會錯過你的觀點。 – fuzzygoat 2010-03-10 16:56:48

+0

因爲Objective-C是帶有O-O擴展名的C語言,所以你總是可以做簡單的舊C語言,再加上你可以混合搭配。 Seva正在談論的是編寫包含Objective-C代碼的普通舊C函數。 (關於一些例子,請看Apple的基礎函數參考。)Seva指出,這些可以放在.m文件中的任何位置。 – jlehr 2010-03-10 17:17:43

+0

啊,我明白了,謝謝你的澄清。 – fuzzygoat 2010-03-10 17:26:30