iOS 單例設(shè)計模式淺談--OC

摘要: 單例的設(shè)計思想非常巧妙,是面向?qū)ο笳Z言的一大優(yōu)勢,在需要全局資源共享的對象時,經(jīng)常會用到這種設(shè)計模式。

iOS 中單例設(shè)計模式的淺析與用法

一、單例的作用

  • 顧名思義,單例,即是在整個項目中,這個類的對象只能被初始化一次。它的這種特性,可以廣泛應(yīng)用于某些需要全局共享的資源中,比如管理類,引擎類,也可以通過單例來實現(xiàn)傳值(通常使用的比較多一些)。UIApplication、NSUserDefaults等都是IOS中的系統(tǒng)單例。

二、單例的寫法

  • 單例的寫法常用的有兩種方式:
1.不考慮線程安全
+(MySingleNoSafeModel *)NoSafeSingle{
static MySingleNoSafeModel *single = nil;
if (!single) {
      single = [[self alloc] init];
     }
    return single;
}
2.考慮線程安全
+(MySingleModel *)customSingle{
    static MySingleModel *single = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        single = [[self alloc] init];
    });
    return  single;
}
3.代碼優(yōu)化
  • 通過上面的方法,我們已經(jīng)可以使用類方法來得到這個單例,但很多時候,項目的工程量很大,還有可能會很多開發(fā)者同時參與一個項目的開發(fā),為了安全與管理代碼的方便,也為了給不是這個單例的創(chuàng)作者但會用到這個單例的開發(fā)人員一些提示,我們通常會重寫一些方法:
  • 首先我們自己實現(xiàn)一個alloc方法:
+(instancetype)myAlloc{    
return [super allocWithZone:nil];
}
  • 將我們的單例實現(xiàn)方法略作修改:
+(KingLPayManager *)sharedMamager{
    static KingLPayManager * manager;
    if (manager==nil) {
        manager=[[KingLPayManager myAlloc] init];
    }
    return manager;
}
  • 然后將一些視圖實例化對象的方法重寫:
+(instancetype)alloc{
    NSAssert(0, @"這是一個單例對象,請使用+(KingLPayManager *)sharedMamager方法");
    return nil;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    return [self alloc];
}
-(id)copy{
    NSLog(@"這是一個單例對象,copy將不起任何作用");
    return self;
}
+(instancetype)new{
    return  [self alloc];
}
  • 注意:這里的alloc使用了斷言,讓任何視圖通過alloc創(chuàng)建對象的程序段斷在此處,給程序員提示。copy方法這里只是簡單的返回了原對象,并未做任何處理,打印信息給程序員提示。
  • 本文的不足之處請多多指教,不勝感激!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容