單例模式是在實際項目開發中用到比較多的一種設計模式,設計原理是整個系統只產生一個對象實例,通過一個統一的方法對外提供這個實例給外部使用。
1 )
@implementation Car
//聲明一個靜態對象引用並賦爲nil
static Car *sharedInstance= nil;
//聲明類方法(+爲類方法,也就是Java中的靜態方法)
+(Car *) sharedInstance
{
if(!sharedInstance)
{
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
@end
//覆蓋allocWithZone:方法可以防止任何類創建第二個實例。使用synchronized()可以防止多個線程同時執行該段代碼(線程鎖)
+(id)allocWithZone:(NSZone *) zone { @synchronized(self) { if(sharedInstance == nil) { sharedInstance = [super allocWithZone:zone]; return sharedInstance; } } return sharedInstance; }
2 ) 自蘋果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)後,創建單例又有了新的方法,那就是使用dispatch_once函數。
void
dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一個參數predicate,該參數是檢查後面第二個參數所代表的代碼塊是否被調用的謂詞,第二個參數則是在整個應用程序中只會被調用一次的代碼塊。
接下來我們來實現自己的單例,這裏有一個SchoolManager類,爲這個類實現單例
- +(SchoolManager *)sharedInstance
- {
- static SchoolManager *sharedManager;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedManager = [[SchoolManager alloc] init];
- });
- return sharedManager;
- }
使用就按照如下方式獲取唯一實例即可:
- SchoolManager *schoolManager = [SchoolManager sharedInstance];