2014-06-19 57 views
0

我也跟着教程來實現辛格爾頓和它工作正常。下面是代碼:內實例方法如何靜態變量的作品 - 辛格爾頓

@implementation DKSingle 

static DKSingle *dKSingle = nil; 

+(id)dKSingleInstance{ 

    if (!dKSingle) { 
     dKSingle = [[DKSingle alloc]init]; 
    } 
    return dKSingle; 
} 


-(id)init{ 

    if (!dKSingle) { 
     dKSingle = [super init]; 
    } 
    return dKSingle; 
} 

@end 

我的問題是dKSingle是一個靜態變量,那麼怎麼來它的工作原理在即時方法 init中。請幫我理解。

+0

您可以在實例方法中使用靜態變量。但是,反過來並不正確。您不能以靜態方法訪問實例變量。 – CrimsonChris

+0

你是正確的老師!這些是我在OOP期間錯過的概念。可以分享任何網站,書籍,我可以從OOP學到所有東西。 – dinesh

+0

http://www.raywenderlich.com/45940/intro-object-oriented-design-part-1 – CrimsonChris

回答

3

靜態變量是存儲在應用程序啓動時分配的所謂「靜態」存儲中的變量,它存在於應用程序的整個生命週期中。在目標c中,它們不是類的一部分,但它們的可訪問性被限定在變量定義的位置。此外,它們與實例變量的區別在於,整個應用程序只有一個實例,而不是每個創建的對象一個實例。

典型地,一種更好的方式來定義在Objective-C單例模式是像這樣:

+ (instancetype)dKSingleInstance { 
    static DKSingle* dKSingle; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     dKSingle = [[DKSingle alloc]init]; 
    }); 
    return dKSingle; 
} 

這使得靜態變量作用域只是一種方法。另外,通過使用dispatch_once,您可以爲初始化靜態變量提供一些線程安全性。

+1

感謝您的回答多沙!但是從oops的學習來看,實例方法不能訪問靜態變量。在我的例子中,它發生和工作也可以。請你從oop概念幫助我。 – dinesh

+0

靜態變量與OOP相反。 OOP設置爲封裝數據,以便只有對象可以修改其狀態,並通過調用暴露的方法進行修改。一個靜態變量不屬於任何對象。它屬於應用程序。許多人認爲這是一個[反模式](http://stackoverflow.com/q/12755539/1270148)出於這個原因。 –