2015-06-26 25 views
0

如果在+ sharedInstance方法之前調用單例類的init方法,會發生什麼情況..?這將導致一個新的對象,如果不是,那麼返回同一個實例的方式?靜態變量在sharedInstance中聲明的事實將對整體結果產生任何影響。如果在+ sharedInstance方法之前調用單例類的init方法,會發生什麼情況..?

+ (LibraryAPI*)sharedInstance 
{ 
    // 1 
    static LibraryAPI *_sharedInstance = nil; 

    // 2 
    static dispatch_once_t oncePredicate; 

    // 3 
    dispatch_once(&oncePredicate, ^{ 
     _sharedInstance = [[LibraryAPI alloc] init]; 
    }); 
    return _sharedInstance; 
} 
+0

看看這個SO [question](http://stackoverflow.com/questions/7274360/how-objective-c-singleton-should-implement-init-method) –

+0

你的問題是對我不清楚。如果我調用[[LibraryAPI alloc] init] 5次,它將創建並返回5個對象。但是如果我調用[LibraryAPI sharedInstance],它將始終返回單例對象。 – swapnilagarwal

回答

0

這取決於init方法的實現方式。默認情況下,您可以使用init創建一個新對象。爲了防止創建此類的實例,可以在init方法中返回nil,併爲您的類創建私有構造器。

-(instancetype)init { 
    return nil; 
} 

-(instancetype)localInit { 
    if(!self) { 
     self = [super init]; 
    } 
    return self; 
} 

所以線

_sharedInstance = [[LibraryAPI alloc] init]; 

將變爲

_sharedInstance = [[LibraryAPI alloc] localInit]; 
+1

在這種情況下不會行「_sharedInstance = [[LibraryAPI alloc] init];」也收到零作爲回報..? –

+0

你是對的!我將刪除代碼示例。基本上你可以編寫另一個init方法,它不能從你的課程外部訪問 - >我更新我的答案。 – Marco

0

在一類的目標C init方法是與 '初始化' 前綴只是方法。這是objc和swift之間最大的區別之一。所以如果你調用init方法是不好的,但是當你的init方法成功返回時你肯定會初始化一個新實例。

函數內部的靜態變量在調用之間保持其值。所以每次調用方法sharedInstance它都會給你相同的實例。更多關於靜態變量檢出here

相關問題