在IOS中單例設(shè)計模式有很廣泛的用途,它保證一個類只有一個實例,并提供一個訪問它的全局訪問點蕉饼,一個app只有一個實列公壤,也就是說他一直存在,除非你手動置空椎椰,在內(nèi)存里面也只會用到一個地址.
蘋果官方提供了很多單列對象供用戶使用,例如:
- UIApplication 類提供了 +sharedApplication 方法創(chuàng)建和獲取 UIApplication 單例.
- NSBundle 類提供了 +mainBundle 方法獲取 NSBundle 單例.
- NSFileManager 類提供了 +defaultManager 方法創(chuàng)建和獲得 NSFileManager 單例(使用代理時需要調(diào)用 -init 實例化方法來實例化一個新的對象).
- NSUserDefaults 類提供了 +defaultUserDefaults 方法去創(chuàng)建和獲取 NSUserDefaults 單例.
- NSNotificationCenter 類提供了 +defaultCenter 方法創(chuàng)建和獲取 NSNotificationCenter 單例.
我所知道的單例有兩種實現(xiàn)方式,根據(jù)線程安全的實現(xiàn)來區(qū)分的話,一種是使用@synchronized
,另一種是使用GCD的dispatch_once
函數(shù)厦幅。
synchronized線程鎖的方式
+(instancetype)sharedPersonSync{
static id instance;
@synchronized(self) {
if(instance == nil){
instance = [[self alloc] init];
}
}
return instance;
}
GCD方式
+(instancetype)sharedPerson{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
Warning:單例雖然可以達到共享傳值的目的,但非必要的情況下最好不要使用單例的方式實例化對象.