国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式-02-單例

2019-11-14 18:20:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

完整的單例通常需要實(shí)現(xiàn)三個(gè)方法(GCD)


  • share方法

    + (instancetype)sharePerson{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _person = [[self alloc] init];    });    return _person;}
  • alloc方法

    + (instancetype)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _person = [super allocWithZone:zone];    });    return _person;}
  • copy方法

    - (id)copyWithZone:(NSZone *)zone{    return _person;}

通過(guò)宏實(shí)現(xiàn)單例(GCD方式)


  • 代碼如下:

    //.h文件#define LYPSingletonH(name) + (instancetype)share##name;//.m文件#define LYPSingletonM(name) /static id _instance; / /+ (instancetype)share##name /{ /    static dispatch_once_t onceToken; /    dispatch_once(&onceToken, ^{ /        _instance = [[self alloc] init]; /    }); /    return _instance; /} / /+ (instancetype)allocWithZone:(struct _NSZone *)zone /{ /    static dispatch_once_t onceToken; /    dispatch_once(&onceToken, ^{ /        _instance = [super allocWithZone:zone]; /    }); /    return _instance; /} / /- (id)copyWithZone:(NSZone *)zone /{ /    return _instance; /}
  • 注意事項(xiàng)

    • 每行后邊的/表示下一行與該部分也是一個(gè)整體
    • .h文件下的一行要加分號(hào),否則在引用的時(shí)候要加分號(hào)
    • 定義宏的新名字后邊必須加空格,因?yàn)榫幾g器,默認(rèn)將新名字開(kāi)始遇到的第一個(gè)空格前的部分作為宏的名字

通過(guò)非GCD方式實(shí)現(xiàn)單例


  • 實(shí)現(xiàn)代碼如下

    static Dog *_dog;+ (instancetype)shareDog{    @synchronized(self)    {        if (_dog == nil)        {            [NSThread sleepForTimeInterval:3];            _dog = [[self alloc] init];        }    }    return _dog;}+ (instancetype)allocWithZone:(struct _NSZone *)zone{    @synchronized(self)    {        if (_dog == nil)        {            [NSThread sleepForTimeInterval:3];            _dog = [super allocWithZone:zone];        }    }    return _dog;}- (id)copyWithZone:(NSZone *)zone{    return _dog;}
  • 注意事項(xiàng)

    • 為創(chuàng)建對(duì)象是分配內(nèi)存和初始化的代碼加鎖,若不加鎖,當(dāng)多個(gè)線程并發(fā)執(zhí)行創(chuàng)建對(duì)象任務(wù),將會(huì)破壞單例模式,創(chuàng)建出多個(gè)對(duì)象(通常在創(chuàng)建對(duì)象耗時(shí)比較長(zhǎng)的時(shí)候發(fā)生)
      @synchronized(self) {}

注意


1.單例模式不能使用繼承實(shí)現(xiàn),否則所有子類創(chuàng)建的對(duì)象都將是第一個(gè)創(chuàng)建的對(duì)象


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 尤溪县| 怀化市| 社会| 皋兰县| 岱山县| 合川市| 盈江县| 福鼎市| 黑山县| 连南| 德昌县| 沈丘县| 阿合奇县| 通榆县| 日照市| 广安市| 西和县| 准格尔旗| 瑞昌市| 邳州市| 阿巴嘎旗| 泰宁县| 平定县| 呼和浩特市| 上思县| 罗平县| 马山县| 大丰市| 峨眉山市| 嘉禾县| 天台县| 开平市| 长垣县| 兴文县| 汝南县| 天柱县| 肥东县| 扎兰屯市| 金平| 长岭县| 高要市|