單例singleton模式–單例類的實(shí)現(xiàn)

單例模式的作用是用來解決一個(gè)應(yīng)用中某個(gè)類只有唯一一個(gè)對(duì)象的問題。單例類在iOS開發(fā)中是非常重要的,在系統(tǒng)提供個(gè)類中,諸如:UIApplication類、NSUserDefaults類、NSNotificationCenter類、NSBundle類都是單例類。

1、單例類的使用

單例類在iOS的應(yīng)用開發(fā)中非常常見,有一些對(duì)象必須保證在整個(gè)應(yīng)用中只有一個(gè),當(dāng)在不同的位置需要使用單例類對(duì)象時(shí),能夠保證獲取的都是同一個(gè)對(duì)象。

例如,我們常見的QQ音樂里面,在每個(gè)節(jié)目下方都有一個(gè)當(dāng)前播放音樂的指示器,即便切換不同的界面,這個(gè)音樂播放指示器都是統(tǒng)一的,這個(gè)就是一個(gè)典型的單例類對(duì)象。

2、單例類的實(shí)現(xiàn)方式

單例類的實(shí)現(xiàn)原理就是要保證單例類對(duì)象的alloc+init操作,在應(yīng)用的整個(gè)生命周期過程中,只執(zhí)行一次。當(dāng)單例類對(duì)象被創(chuàng)建后,假如在其他多個(gè)地方需要使用該對(duì)象,則無需執(zhí)行alloc+init操作,而是直接返回已經(jīng)存在的對(duì)象即可。

在單例類的實(shí)現(xiàn)過程中,為了保證alloc+init只執(zhí)行一次,可以使用dispatch_once函數(shù),dispatch_once函數(shù)的作用就是在整個(gè)應(yīng)用生命周期中執(zhí)行一次代碼塊。

單例類的創(chuàng)建過程是完全一致的,因此,單例類的實(shí)現(xiàn)代碼只要直接復(fù)制/粘貼即可。通過下方的代碼,就能夠?qū)崿F(xiàn)如下功能:

創(chuàng)建一個(gè)單例類;

提供了一個(gè)類方法sharedInstance,通過該方法就能夠獲取到該單例類的對(duì)象;

提供了copy方法,調(diào)用copy方法時(shí),也是返回已經(jīng)存在的單例類對(duì)象;

(注意:由于ARC已經(jīng)成為主流,所以以下的單例類創(chuàng)建方法只考慮ARC)

.h文件

#import

@interfaceSingleton:NSObject

/**

*? 獲取單例類

*

*? @return 單例類對(duì)象

*/

+(instancetype)sharedInstance;

@end

.m文件

#import "Singleton.h"

@implementationSingleton

staticid _instance;

+(instancetype)sharedInstance

{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,^{

_instance=[[selfalloc]init];

});

return_instance;

}

+(id)allocWithZone:(struct_NSZone*)zone

{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,^{

_instance=[superallocWithZone:zone];

});

return_instance;

}

-(id)copyWithZone:(NSZone*)zone

{

return_instance;

}

@end

3、示例代碼

通過實(shí)際的代碼來驗(yàn)證以下單例類的實(shí)現(xiàn)效果。

創(chuàng)建三個(gè)自定義類:HCPerson、HCStudent、HCDog,其中:HCStudent是HCPerson的子類;

把HCPerson和HCDog定義為單例類,即拷貝上面代碼中@interface~@end以及@implementation~@end中的部分,分別到類的.h和.m文件中;

在main()函數(shù)中,實(shí)現(xiàn)如下代碼:

#import

#import "HCDog.h"

#import "HCPerson.h"

#import "HCStudent.h"

intmain(intargc,constchar*argv[]){

@autoreleasepool{

HCDog*dog1=[HCDogsharedInstance];

HCDog*dog2=[[HCDogalloc]init];

HCDog*dog3=[dog1 copy];

NSLog(@"dog1: %p, dog2: %p, dog3: %p",dog1,dog2,dog3);

HCPerson*person1=[[HCPersonalloc]init];

HCPerson*person2=[HCPersonsharedInstance];

HCStudent*student1=[[HCStudentalloc]init];

HCStudent*student2=[HCStudentsharedInstance];

NSLog(@"person1: %p, person2: %p, student1: %p, student2: %p",person1,person2,student1,student2);

}

return0;

}

運(yùn)行結(jié)果如下。我們可以看到,對(duì)于HCDog類,不論使用sharedInstance方法、alloc+init,還是copy方法,最后得到的都是同一個(gè)對(duì)象。對(duì)于HCPerson類來說,由于HCPerson類是單例類,因此,其子類也是單例類。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • github 1、直播喵播MGMiaoBo下載 2、逗視:逗你玩的直播App,可下載試玩 看下效果 前言: 單例模...
    Mg明明就是你閱讀 1,506評(píng)論 2 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • 單例:意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單...
    CoderZS閱讀 639評(píng)論 1 13
  • 在開發(fā)中經(jīng)常會(huì)用到單例設(shè)計(jì)模式,目的就是為了在程序的整個(gè)生命周期內(nèi),只會(huì)創(chuàng)建一個(gè)類的實(shí)例對(duì)象,而且只要程序不被殺死...
    不要重名就好閱讀 596評(píng)論 0 0
  • iOS開發(fā)多線程篇—單例模式(ARC) 一、簡單說明: 設(shè)計(jì)模式:多年軟件開發(fā),總結(jié)出來的一套經(jīng)驗(yàn)、方法和工具 j...
    不會(huì)打滾兒的獅子閱讀 574評(píng)論 0 2

友情鏈接更多精彩內(nèi)容