第一部分: 創建一個單例對象
單例的應用場景:
單例模式用於當一個類只能有一個實例的時候, 通常情況下這個“單例”代表的是某一個物理設備比如打印機,或是某種不可以有多個實例同時存在的虛擬資源或是系統屬性比如一個程序的某個引擎或是數據。用單例模式加以控制是非常有必要的。
什麼是單例模式?
單例是一種常用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行爲。
單例設計模式需要達到下面幾個目的: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];
- }
- //這是單例對象遵循<NSCopying>協議時需要實現的方法
- -(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:(voidvoid *)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