一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

iOS單例的完整寫法

 印度阿三17 2019-09-09
原文鏈接:https://my.oschina.net/zyboy/blog/617435

單例模式在iOS開發(fā)中是最為常用的模式之一,在應(yīng)用這個(gè)模式時(shí),單例對象的類必須保證只有一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。一般情況下,許多人都是按下面的方式寫單例模式:

#import "Singleton.h"

@implementation Singleton

static Singleton *shareSingleton = nil;

  (instancetype)shareSingleton {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shareSingleton = [[self alloc] init];
    });
    return shareSingleton;
}

@end

測試一下這種方法可行不:

Singleton *one = [Singleton shareSingleton];
    NSLog(@"one = %@", one);

    Singleton *two = [Singleton shareSingleton];
    NSLog(@"two = %@", two);

    Singleton *three = [[Singleton alloc] init];
    NSLog(@"three = %@", three);

控制臺輸出內(nèi)容:
2015-12-22 15:31:38.230 Singleton[2264:1996979] one = <Singleton: 0x7fe598f4d3c0>
2015-12-22 15:31:38.230 Singleton[2264:1996979] two = <Singleton: 0x7fe598f4d3c0>
2015-12-22 15:31:38.231 Singleton[2264:1996979] three = <Singleton: 0x7fe598edc570>

由此可見,只有調(diào)用shareSingleton方法獲得的對象是相通的,用alloc init來構(gòu)造對象的時(shí)候,得到的確實(shí)不一樣的結(jié)果。究其原因,當(dāng)使用alloc init創(chuàng)建對象時(shí),在調(diào)用alloc方法時(shí),oc內(nèi)部會調(diào)用allocWithZone這個(gè)方法來申請內(nèi)存,為了避免allocWithZone申請新的內(nèi)存,可以重寫allocWithZone方法,在該方法中調(diào)用shareSingleton方法返回單例對象??截悓ο笠彩峭瑯拥牡览?。

完整代碼如下:

#import "Singleton.h"

@implementation Singleton

static Singleton *shareSingleton = nil;

  (instancetype)shareSingleton {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shareSingleton = [[super allocWithZone:NULL] init];
    });
    return shareSingleton;
}

  (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [Singleton shareSingleton];
}

- (id)copyWithZone:(struct _NSZone *)zone {
    return [Singleton shareSingleton];
}

@end

測試:

Singleton *one = [Singleton shareSingleton];
    NSLog(@"one = %@", one);

    Singleton *two = [Singleton shareSingleton];
    NSLog(@"two = %@", two);

    Singleton *three = [[Singleton alloc] init];
    NSLog(@"three = %@", three);

    Singleton *four = [[Singleton alloc] init];
    NSLog(@"four = %@", [four copy]);

    Singleton *five = [Singleton new];
    NSLog(@"five = %@", five);

結(jié)果:
2015-12-22 17:01:52.350 Singleton[2399:2262945] one = <Singleton: 0x7f9e6be4ae30>
2015-12-22 17:01:52.350 Singleton[2399:2262945] two = <Singleton: 0x7f9e6be4ae30>
2015-12-22 17:01:52.351 Singleton[2399:2262945] three = <Singleton: 0x7f9e6be4ae30>
2015-12-22 17:01:52.351 Singleton[2399:2262945] four = <Singleton: 0x7f9e6be4ae30>
2015-12-22 17:01:52.351 Singleton[2399:2262945] five = <Singleton: 0x7f9e6be4ae30>

轉(zhuǎn)載于:https://my.oschina.net/zyboy/blog/617435

來源:https://www./content-4-445101.html

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    制服丝袜美腿美女一区二区| 五月的丁香婷婷综合网| 中文字日产幕码三区国产| 99久热只有精品视频免费看| 日韩精品在线观看一区| 国产无摭挡又爽又色又刺激| 91偷拍视频久久精品| 日韩精品一级片免费看| 最好看的人妻中文字幕| 日韩欧美国产三级在线观看| 色偷偷偷拍视频在线观看| 亚洲天堂一区在线播放| 99热在线播放免费观看| 加勒比日本欧美在线观看| 亚洲中文字幕剧情在线播放| 极品少妇一区二区三区精品视频| 欧美精品久久一二三区| 成人国产激情福利久久| 日韩国产传媒在线精品| 亚洲一区二区精品免费| 在线免费不卡亚洲国产| 日韩中文字幕欧美亚洲| 色欧美一区二区三区在线| 99久久精品一区二区国产| 小草少妇视频免费看视频| 免费在线成人激情视频| 黄色激情视频中文字幕| 欧美久久一区二区精品| 丝袜诱惑一区二区三区| 日韩人妻欧美一区二区久久| 欧美一级特黄大片做受大屁股| 日韩精品第一区二区三区| 久久香蕉综合网精品视频| 男人把女人操得嗷嗷叫| 久草精品视频精品视频精品| 人妻巨大乳一二三区麻豆| 国产成人精品在线播放| 91偷拍视频久久精品| 欧美老太太性生活大片| 亚洲一区二区三区三州| 中文字幕乱子论一区二区三区|