筆記1:?jiǎn)卫膬煞N模式

單例有兩種模式,一種是餓漢式,一種是懶漢式.所謂懶漢式即使用時(shí)創(chuàng)建對(duì)象榜轿,類似于懶加載或粮。餓漢式即為當(dāng)程序運(yùn)行加載到內(nèi)存時(shí)就創(chuàng)建导饲。

> 懶漢式的創(chuàng)建方式

+ (void)initialize {
    if (_shareIntance == nil) {
         NSLog(@"load---我被創(chuàng)建了");
        _shareIntance = [[self alloc] init];
    }
}

程序一運(yùn)行就會(huì)創(chuàng)建


> 餓漢式的創(chuàng)建方式

#import "ViewController.h"
#import "ZQMusicManager.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    ZQMusicManager *m = [[ZQMusicManager alloc] init];
}

ZQMusicManager.m中

+ (void)initialize {
    if (_shareIntance == nil) {
        NSLog(@"initialize---我被創(chuàng)建了");
        _shareIntance = [[self alloc] init];
    }
}

運(yùn)行結(jié)果


常用gcd方式來實(shí)現(xiàn)單例,完整形式如下

static id _shareIntance;

+ (instancetype)shareIntance
{
    if (_shareIntance == nil) {
        _shareIntance = [[self alloc] init];
    }
    return _shareIntance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    if (!_shareIntance) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _shareIntance = [super allocWithZone:zone];
        });
    }
    return _shareIntance;
}

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

- (id)mutableCopyWithZone:(NSZone *)zone
{
    return _shareIntance;
}

注意:單例不可繼承
項(xiàng)目里有很多單例時(shí)氯材,可使用宏創(chuàng)建

// .h文件
#define HMSingletonH + (instancetype)sharedInstance;

// .m文件
#define HMSingletonM \
static id _instance; \
 \
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
 \
+ (instancetype)sharedInstance \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
} \
 \
- (id)copyWithZone:(NSZone *)zone \
{ \
    return _instance; \
} \
 \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
}

.h 直接使用宏

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ZQMusicManager : NSObject
ZQSingletonH
@end

NS_ASSUME_NONNULL_END

.m 直接使用宏

#import "ZQMusicManager.h"

@implementation ZQMusicManager
ZQSingletonM
@end

控制器里可以直接使用

- (void)viewDidLoad {
    [super viewDidLoad];
    ZQMusicManager *m = [ZQMusicManager sharedInstance];
}

如果想像[UIApplication sharedApplication]可以寫sharedXXX
宏可以如下定義:

#define ZQSingletonH(name) + (instancetype)shared##name;

// .m文件
#define ZQSingletonM(name) \
static id _instance; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instance; \
} \
\
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
}

.h 使用方式

@interface ZQMusicManager : NSObject
ZQSingletonH(MusicManager)
@end

.m 使用方式

@interface ZQMusicManager : NSObject
ZQSingletonH(MusicManager)
@end

VC創(chuàng)建使用

- (void)viewDidLoad {
    [super viewDidLoad];
    ZQMusicManager *m = [ZQMusicManager sharedMusicManager];
}

結(jié)尾:
一個(gè)熱愛iOS編程的小伙渣锦。
轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氢哮,一起剝皮案震驚了整個(gè)濱河市袋毙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冗尤,老刑警劉巖听盖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裂七,居然都是意外死亡皆看,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門背零,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腰吟,“玉大人,你說我怎么就攤上這事捉兴⌒В” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵倍啥,是天一觀的道長(zhǎng)禾乘。 經(jīng)常有香客問我,道長(zhǎng)虽缕,這世上最難降的妖魔是什么始藕? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮氮趋,結(jié)果婚禮上伍派,老公的妹妹穿的比我還像新娘。我一直安慰自己剩胁,他們只是感情好诉植,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昵观,像睡著了一般晾腔。 火紅的嫁衣襯著肌膚如雪舌稀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天灼擂,我揣著相機(jī)與錄音壁查,去河邊找鬼。 笑死剔应,一個(gè)胖子當(dāng)著我的面吹牛睡腿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峻贮,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼席怪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了月洛?” 一聲冷哼從身側(cè)響起何恶,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚼黔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惜辑,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唬涧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盛撑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎节。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抵卫,靈堂內(nèi)的尸體忽然破棺而出狮荔,到底是詐尸還是另有隱情,我是刑警寧澤介粘,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布殖氏,位于F島的核電站,受9級(jí)特大地震影響姻采,放射性物質(zhì)發(fā)生泄漏雅采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一慨亲、第九天 我趴在偏房一處隱蔽的房頂上張望婚瓜。 院中可真熱鬧,春花似錦刑棵、人聲如沸巴刻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡陪。三九已至沥寥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間督弓,已是汗流浹背营曼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愚隧,地道東北人蒂阱。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狂塘,于是被迫代替她去往敵國(guó)和親录煤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345