iOS常用設計模式——單例模式
第一部分: 建立一個單例對象
單例的應用情境:
單例模式用於當一個類只能有一個執行個體的時候, 通常情況下這個“單例”代表的是某一個物理裝置比如印表機,或是某種不可以有多個執行個體同時存在的虛擬資源或是系統屬性比如一個程式的某個引擎或是資料。用單例模式加以控制是非常有必要的。
什麼是單例模式?
單例是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只有一個執行個體存在。許多時候整個系統只需要擁有一個的全域對象,這樣有利於我們協調系統整體的行為。
單例設計模式需要達到下面幾個目的:1.)封裝一個共用的資源; 2.)提供一個固定的執行個體建立方法; 3.)提供一個標準的執行個體提供者
常用的定義單例的方法(ARC+GCD)
//實現一個建立單例對象的類方法static ClassType *objName = nil; + (ClassType *) sharedInstance{static dispatch_once_t oneToken = 0;dispatch_once(&onceToken, ^{objName = [[super allocWithZone: NULL] init];});return objName; }//重寫幾個方法,防止建立單例對象時出現錯誤-(id) init{If(self = [super init]){//初始化單例對象的各種屬性}return self;}+(id)allocWithZone: (struct _NSZone *) zone{return [self sharedInstance];}//這是單例對象遵循協議時需要實現的方法-(id) copyWithZone: (struct _NSZone *)zone{return self;}
第二部分:就地取材使用UIApplication單例
直接在AppDelegate中建立執行個體變數,然後在項目的其他檔案中使用這些變數。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shareApplication] delegate];appDelegate.a = 10086;appDelegate.globalString = @”中國想聯通’;
這樣,你可以定義一個全域執行個體變數。
詳細請參考:http://blog.csdn.net/casablaneca/article/details/21074413
第三部分:在項目中使用單例設計模式
項目描述:我們希望通過一個button的點擊事件觸發單例對象中的一個屬性值發生變化,然後使用KVO在ViewController的兩個子視圖(LeftView, RightView)上監聽這個屬性值得變化,並將變化後的數值在LeftView和RightView上顯示出來。
1.) 在ViewController上設定一個button和一個觸發事件
-(IBAction) refreshData: (id) sender{//stockForKVO為單例對象stockForKVO.price = arc4random()%100;}
2.) 在LefeView和RightVIew的對象中使用KVO監聽單例對象中屬性值的變化
stockForKVO = [StockData sharedInstance]; [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];//實現回調方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"price"]) { showLabel.text = [NSString stringWithFormat:@"%f",stockForKVO.price]; NSLog(@" left change: %@", change); }}
3.)實現後的效果2所示
圖2: 右邊為button事件觸發後的情境,左邊為初始化時的情境
項目的源碼: http://download.csdn.net/detail/luozhonglan/8005001