IOS 單例模式

在我認(rèn)為單例最大的優(yōu)點(diǎn)就是:通過單例方式訪問的實(shí)例,都是同一個(gè)沼本。

這個(gè)優(yōu)點(diǎn)也是我在藍(lán)牙音樂盒項(xiàng)目中使用單例模式實(shí)現(xiàn)外設(shè)控制類和AVFoundation類的原因噩峦。
你們想锭沟,假設(shè)我在a,b,c頁面都會調(diào)用到_player,那么我再a頁面點(diǎn)擊播放抽兆、上一首、下一首等等操作后族淮,怎么讓b,c頁面知道并同步呢辫红?我一開始使用的是通知。可是我試了后發(fā)現(xiàn),最好的還是單例行疏。
單例模式下的無論在那個(gè)類訪問_player實(shí)例精算,它的狀態(tài)都是最新的,也就是a點(diǎn)了播放续捂,那么我在b,c頁面訪問_play實(shí)例,就可以知道它的狀態(tài)是播放的预厌,不需要通知娩鹉。


創(chuàng)建單例:

.h

+ (CustomObject *)share;

.m
+ (CustomObject *)share{
    static CustomObject *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[CustomObject alloc] init];
    });
    return instance;
}

代碼解釋:鏈接
dispatch_once主要根據(jù)onceToken的值來決定是否執(zhí)行block里的方法攻谁,如果onceToken==0,線程執(zhí)行block里的方法,當(dāng)onceToken==-1弯予,線程不執(zhí)行block戚宦。當(dāng)onceToken為其他值時(shí),線程被阻塞锈嫩,等待onceToken值改變受楼。
當(dāng)線程首先調(diào)用instance,某一線程要執(zhí)行block中的代碼時(shí)呼寸,首先需要改變onceToken的值艳汽,再去執(zhí)行block中的代碼。這里onceToken的值變?yōu)榱?40734731430192等舔。這樣當(dāng)其他線程再獲取onceToken的值時(shí)骚灸,值已經(jīng)變?yōu)?40734731430192。其他線程被阻塞慌植。當(dāng)block線程執(zhí)行完block之后甚牲。onceToken變?yōu)?1。其他線程不再阻塞蝶柿,跳過block丈钙。下次再調(diào)用shareInstance時(shí),block已經(jīng)為-1雏赦。直接跳過block。這樣dispatch_once在首次調(diào)用時(shí)同步阻塞線程芙扎,生成單例之后星岗,不再阻塞線程圈浇。dispatch_once是創(chuàng)建單例的最優(yōu)方案


通過下面代碼可以理解單例的優(yōu)點(diǎn):

viewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    CustomObject *cv = [CustomObject share];
    cv.tempString = @"123";
}


SecondView.m

- (void)viewDidLoad {
    [super viewDidLoad];
    CustomObject *cv = [CustomObject share];
    NSLog(@"%@",cv.tempString);
}

CocoaPodsDemo[87052:9724995] 123

可以看到:
1.獲取CustomObject對象的實(shí)例很方便蜜宪。
2.在兩個(gè)類里的實(shí)例變量實(shí)際上是同一個(gè)圃验,沒有重新alloc空間,節(jié)省了內(nèi)存缝呕。當(dāng)然澳窑,通過單例創(chuàng)建的實(shí)例常駐內(nèi)存,所以資源開銷就見仁見智供常。
3.獲取實(shí)例的狀態(tài)非常容易摊聋。因?yàn)槭峭粋€(gè)實(shí)例,當(dāng)我在第一個(gè)類里改變了tempString狀態(tài)為@"123",我再第二個(gè)類想要獲取tempString的狀態(tài)馬上就變成了@"123"栈暇。

第三條原因讓單例使用起來非常爽麻裁,也是我認(rèn)為單例最大的優(yōu)點(diǎn),這我一開始就說過了。


注意:
訪問單例類一定要通過定義的單例方法+ (CustomObject *)share源祈。如果依舊使用alloc煎源、init或者new就會發(fā)生下面的情況

viewController.h

- (void)viewDidLoad {
    [super viewDidLoad];
    CustomObject *cv = [CustomObject share];
    cv.tempString = @"123";
}

SecondView.h

- (void)viewDidLoad {
    [super viewDidLoad];
    CustomObject *cv = [[CustomObject alloc] init];
    NSLog(@"%@",cv.tempString);
}

CocoaPodsDemo[87052:9724995] (null)

解釋:
上面兩個(gè)類里獲得的實(shí)例其實(shí)不是同一個(gè),因?yàn)橥ㄟ^單例方式獲得實(shí)例本來就是通過封鎖alloc init方法實(shí)現(xiàn)的香缺,但是我再SecondView重新使用了alloc/init方法實(shí)例化了手销。

那么如何避免呢?下面是我想的一種方法图张,希望指點(diǎn):



- (instancetype)init{
    return [CustomObject share];
}

- (instancetype)initHidden{
    self = [super init];
    if (self) {
        
    }
    return self;
}

+ (CustomObject *)share{
    static CustomObject *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[CustomObject alloc] initHidden];
    });
    return instance;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锋拖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祸轮,更是在濱河造成了極大的恐慌兽埃,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适袜,死亡現(xiàn)場離奇詭異柄错,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痪蝇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門鄙陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕房,“玉大人躏啰,你說我怎么就攤上這事“也幔” “怎么了给僵?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我帝际,道長蔓同,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任蹲诀,我火速辦了婚禮斑粱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脯爪。我一直安慰自己则北,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布痕慢。 她就那樣靜靜地躺著尚揣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掖举。 梳的紋絲不亂的頭發(fā)上快骗,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音塔次,去河邊找鬼方篮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛励负,可吹牛的內(nèi)容都是我干的恭取。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼熄守,長吁一口氣:“原來是場噩夢啊……” “哼蜈垮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裕照,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤攒发,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晋南,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠猿,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年负间,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偶妖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡政溃,死狀恐怖趾访,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情董虱,我是刑警寧澤扼鞋,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布申鱼,位于F島的核電站,受9級特大地震影響云头,放射性物質(zhì)發(fā)生泄漏捐友。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一溃槐、第九天 我趴在偏房一處隱蔽的房頂上張望匣砖。 院中可真熱鬧,春花似錦昏滴、人聲如沸脆粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽变隔。三九已至,卻和暖如春蟹倾,著一層夾襖步出監(jiān)牢的瞬間匣缘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工鲜棠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肌厨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓豁陆,卻偏偏與公主長得像柑爸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子盒音,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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