正確認識單例模式

文藝求關注.png

啊喂,你遇到面試官要求你手寫單例模式了嗎张抄?那對于單例模式,你還記得多少洼怔?

  • <b>單例模式的作用</b>

    • 可以保證在程序運行過程中署惯,一個類只有一個實例,而且該實力易于供外界訪問
    • 方便控制實例個數(shù)镣隶,節(jié)約系統(tǒng)資源
  • <b>單例模式的使用場景</b>

    • 在整個應用中极谊,共享一份資源(這份資源只需要創(chuàng)建初始化1次)
  • <b>ARC環(huán)境下的單例模式</b>

//.h文件
// 對外爆露類方法
// 原因:1.方便外部調(diào)用使用
//      2.為了表明身份
// 注意命名規(guī)范:shar + 類名 / default + 類名 / share / default
+ (instancetype) shareTools;

// .m文件
// 1.提供全局變量
static VtcTools *_instance;
// 2.從寫alloc方法 --> allocWithZone
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
  • 第一種方法
    // 加互斥鎖解決多線程訪問安全問題
    @synchronized (self) {
        if (_instance == nil) {
            _instance = [super allocWithZone:zone]; // 外界調(diào)用:VtcTools *t1 = [[VtcTools alloc] init];
        }
    }
  • 第二種方法
    // 一次性函數(shù),本身就是線程安全的
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone]; // 外界調(diào)用:VtcTools *t2 = [[VtcTools alloc] init];
    });
    return _instance;
}
// 3.提供類方法
+ (instancetype)shareTools {

    return [[self alloc] init]; // 外界調(diào)用:VtcTools *t3 = [VtcTools shareTools];
}
// 4.嚴謹寫法(從寫以下兩種方法)
- (id)copyWithZone:(NSZone *)zone {

    return _instance;   // 外界調(diào)用方法:VtcTools *t4 = [t1 copy];
}

- (id)mutableCopyWithZone:(NSZone *)zone {

    return _instance;   // 外界調(diào)用方法:VtcTools *t5 = [t1 mutableCopy];
}
  • <h5>MRC環(huán)境下的單例模式</h5>
// 修改環(huán)境 --> Build Settings (search) automatic A...R....C...  NO
//.h文件
// 對外爆露類方法
// 原因:1.方便外部調(diào)用使用
//      2.為了表明身份
// 注意命名規(guī)范:shar + 類名 / default + 類名 / share / default
+ (instancetype) shareTools;
//.m文件
// 1.提供全局變量
static VtcTools *_instance;
// 2.從寫allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    
    // 第一種方法
    // 加互斥鎖解決多線程訪問安全問題
    @synchronized (self) {
        if (_instance == nil) {
            _instance = [super allocWithZone:zone]; // 外界調(diào)用:VtcTools *t1 = [[VtcTools alloc] init];
        }
    }
    
    // 第二種方法
    // 本身就是線程安全的
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone]; // 外界調(diào)用:VtcTools *t2 = [[VtcTools alloc] init];
    });
    return _instance;
}
// 3.提供類方法
+ (instancetype)shareTools {
    
    return [[self alloc] init]; // 外界調(diào)用:VtcTools *t3 = [VtcTools shareTools];
}
// 4.嚴謹寫法(從寫以下兩種方法)
- (id)copyWithZone:(NSZone *)zone {
    
    return _instance;   // 外界調(diào)用方法:VtcTools *t4 = [t1 copy];
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    
    return _instance;   // 外界調(diào)用方法:VtcTools *t5 = [t1 mutableCopy];
}
#if __has_feature(objc_arc)
// 條件滿足ARC
#else
// MRC
- (oneway void)release {
}

- (instanceytpe)retain {
}
// 習慣性重寫
- (NSUInteger) retainCont {

    return MAXFLOAT;
}
#endif

<b> 0财瘛轻猖!注意:在使用中,記得retain一次域那,就需要release一次~</b>
-<h5> A摺!注意:單例模式是不能使用繼承的</h5>

// 單例模式通用宏
//新建.h文件:Singleton
#define SingletonH(name) + (instancetype) share##name;
#if __has_feature(objc_arc)
// 條件滿足ARC
#define SingletonM(name) static VtcTools *_instance;    \
+ (instancetype)allocWithZone:(struct _NSZone *)zone {  \
    static dispatch_once_t onceToken;   \
    dispatch_once(&onceToken, ^{    \
        _instance = [super allocWithZone:zone];     \
    }); \
    return _instance;   \
}   \
+ (instancetype)share##name {    \
    return [[self alloc] init]; \
}   \
- (id)copyWithZone:(NSZone *)zone { \
    return _instance;   \
}   \
- (id)mutableCopyWithZone:(NSZone *)zone {  \
    return _instance;   \
}
#else
// MRC
#define SingletonM(name) static VtcTools *_instance;    \
+ (instancetype)allocWithZone:(struct _NSZone *)zone {  \
    static dispatch_once_t onceToken;   \
    dispatch_once(&onceToken, ^{    \
        _instance = [super allocWithZone:zone];     \
    }); \
    return _instance;   \
}   \
+ (instancetype)share##name {    \
    return [[self alloc] init]; \
}   \
- (id)copyWithZone:(NSZone *)zone { \
    return _instance;   \
}   \
- (id)mutableCopyWithZone:(NSZone *)zone {  \
    return _instance;   \
}   \
- (oneway void)release {    \
}   \
- (instanceytpe)retain {    \
}   \
- (NSUInteger) retainCont { \
    return MAXFLOAT;\
}
#endif
// 外界調(diào)用:
  //  .h #import "Singleton.h"
      // SingletonH  (輸入name)
  //  .m  SingletonM  (輸入name)
關注一下又不會懷孕.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次员,一起剝皮案震驚了整個濱河市样眠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠肘,老刑警劉巖檐束,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異束倍,居然都是意外死亡被丧,警方通過查閱死者的電腦和手機盟戏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥桂,“玉大人柿究,你說我怎么就攤上這事』蒲。” “怎么了蝇摸?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長办陷。 經(jīng)常有香客問我貌夕,道長,這世上最難降的妖魔是什么民镜? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任啡专,我火速辦了婚禮,結果婚禮上制圈,老公的妹妹穿的比我還像新娘们童。我一直安慰自己,他們只是感情好鲸鹦,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布慧库。 她就那樣靜靜地躺著,像睡著了一般馋嗜。 火紅的嫁衣襯著肌膚如雪齐板。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天嵌戈,我揣著相機與錄音覆积,去河邊找鬼。 笑死熟呛,一個胖子當著我的面吹牛宽档,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庵朝,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吗冤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九府?” 一聲冷哼從身側(cè)響起椎瘟,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侄旬,沒想到半個月后肺蔚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡儡羔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年宣羊,在試婚紗的時候發(fā)現(xiàn)自己被綠了璧诵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仇冯,死狀恐怖之宿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苛坚,我是刑警寧澤比被,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站泼舱,受9級特大地震影響等缀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柠掂,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一项滑、第九天 我趴在偏房一處隱蔽的房頂上張望依沮。 院中可真熱鬧涯贞,春花似錦、人聲如沸危喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辜限。三九已至皇拣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄嫡,已是汗流浹背氧急。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫深,地道東北人吩坝。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像哑蔫,于是被迫代替她去往敵國和親钉寝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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