單例的使用及避免對單例的濫用

單例應該只用來保存全局的狀態(tài)隘膘,并且不能和任何作用域綁定仿吞。如果這些狀態(tài)的作用域比一個完整的應用程序的生命周期要短,那么這個狀態(tài)就不應該使用單例來管理半醉。用一個單例來管理用戶綁定的狀態(tài)甸祭,是代碼的壞味道碴萧,你應該認真的重新評估你的對象圖的設計囱嫩。

1苦蒿、首先說一下單例的使用

單例就是保證整個系統(tǒng)只有一個實例對象,并且自行實例化委造,向整個系統(tǒng)提供這個實例戳鹅。

單例模式的出現(xiàn)為我們帶來了很大的好處,我們可以將那些初始化比較耗費資源的操作用單例來設計昏兆,比如在我的項目中用到了藍牙枫虏,而且在不同的界面都有用到,我就把藍牙的Manager做成了一個單例爬虱,這樣只有第一次初始化藍牙模塊的時候耗時一點隶债,節(jié)省了時間。另外可以利用單例來傳值等操作跑筝。那么我們該如何創(chuàng)建單例呢死讹?

  • 方法1,比較傳統(tǒng)的寫法:
+(instancetype)shared{
    static LaunchIntroductionView *singleInstance = nil;
    @synchronized(self) {
        if (singleInstance == nil) {
            singleInstance = [[LaunchIntroductionView alloc] init];
        }
    }
    return singleInstance;
}

synchronized的使用時為了線程安全曲梗,比如有兩個線程A和B赞警,加入他們同時調(diào)用shared方法,如果不加同步的話則很可能會導致并發(fā)虏两,這樣可能就創(chuàng)建出來了兩個實例愧旦,而不是真正的單例模式了,所以需要加上同步(synchronized)定罢,來保證同一個時刻只有一個線程在訪問這個實例笤虫。這樣做是實現(xiàn)了單例,而且是線程安全的祖凫,但這樣就沒有一點問題了嗎琼蚯?問題還是有的,那就是時間的問題惠况,因為這樣寫之后我們每次調(diào)用shared都會去判斷singleInstance == nil是不是成立的凌停,這樣就避免不了浪費了判斷的時間,有人或許會說就那么一丁點的時間還用考慮嗎售滤?是的罚拟,我覺得能節(jié)省的時間我們一點都不要浪費。如果你認可了我這一點完箩,那么我們接著往下看第二種方法赐俗。

  • 方法2,雙重檢查加鎖:
    所謂雙重檢查機制指的是每次進入這個方法時先去判斷實例是不是為nil弊知,如果部位nil則直接返回阻逮,反之則進入同步檢查,然后再判斷是不是為nil若不存在則創(chuàng)建一個實例秩彤,專業(yè)養(yǎng)的話就只需要同步一次就行了叔扼,從而減少了同步時的判斷需要耗費的時間事哭,代碼更清晰:
+(instancetype)shared{
    volatile static LaunchIntroductionView *singleInstance = nil;
    if (singleInstance == nil) {
        @synchronized(self) {
            if (singleInstance == nil) {
                singleInstance = [[LaunchIntroductionView alloc] init];
            }
        }
    }
    return singleInstance;
}

關于這一點參考自IOS單例模式及單例模式的優(yōu)缺點 ,非常感謝瓜富!之所以使用volatile修飾鳍咱,是因為被volatile修飾的變量的值不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內(nèi)存与柑,從而確保多個線程能正確的處理該變量谤辜。

  • 方法3,GCD:
+(instancetype)shared{
    static LaunchIntroductionView *launch = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)];
    });
    return launch;
}

這個就不過多介紹了价捧,網(wǎng)上的資料實在是太多了丑念。


2、單例的濫用
單例給我們帶來方便的同時也有一定的副作用结蟋,因為單例對象一旦創(chuàng)建脯倚,對象指針是保存在靜態(tài)區(qū)的,單例對象在堆中分配的內(nèi)存空間只有在程序終止后才會釋放嵌屎,過多的單例必定會增大我們消耗的內(nèi)存挠将,所以只有當我們確實需要唯一的使用對象時才需要考慮單例模式,切勿濫用單例编整,引用開頭的話:單例應該只用來保存全局的狀態(tài),并且不能和任何作用域綁定乳丰。如果這些狀態(tài)的作用域比一個完整的應用程序的生命周期要短掌测,那么這個狀態(tài)就不應該使用單例來管理。
說起來是挺容易的产园,但現(xiàn)實中對單例的濫用到處都是汞斧,一不留神就埋下了“禍根”,我在一句代碼搞定啟動引導頁中就對單例進行了濫用什燕,所以我們在使用單例的時候一定要想清楚了粘勒,我們是不是真的有必要用單例,如果這個對象的創(chuàng)建不是那么的費時費力屎即,或者這個對象沒必要再應用的整個生命周期中一直存在庙睡,那么我們是不是考慮一下?lián)Q用其他的方式,而非單例技俐?


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雕擂,一起剝皮案震驚了整個濱河市啡邑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌井赌,老刑警劉巖谤逼,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贵扰,死亡現(xiàn)場離奇詭異,居然都是意外死亡流部,警方通過查閱死者的電腦和手機戚绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贵涵,“玉大人列肢,你說我怎么就攤上這事”雒” “怎么了瓷马?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跨晴。 經(jīng)常有香客問我欧聘,道長,這世上最難降的妖魔是什么端盆? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任怀骤,我火速辦了婚禮,結(jié)果婚禮上焕妙,老公的妹妹穿的比我還像新娘蒋伦。我一直安慰自己,他們只是感情好焚鹊,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布痕届。 她就那樣靜靜地躺著,像睡著了一般末患。 火紅的嫁衣襯著肌膚如雪研叫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天璧针,我揣著相機與錄音嚷炉,去河邊找鬼。 笑死探橱,一個胖子當著我的面吹牛申屹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隧膏,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼独柑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了私植?” 一聲冷哼從身側(cè)響起忌栅,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后索绪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湖员,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年瑞驱,在試婚紗的時候發(fā)現(xiàn)自己被綠了娘摔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唤反,死狀恐怖凳寺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彤侍,我是刑警寧澤肠缨,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盏阶,受9級特大地震影響晒奕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜名斟,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一脑慧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砰盐,春花似錦闷袒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒋腮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕各,已是汗流浹背池摧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留激况,地道東北人作彤。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乌逐,于是被迫代替她去往敵國和親竭讳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 單例模式(SingletonPattern)一般被認為是最簡單浙踢、最易理解的設計模式绢慢,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,253評論 4 34
  • 覺得文章不錯洛波,轉(zhuǎn)自:http://www.reibang.com/p/09cb4c59c8da序單例應該只用來保存...
    以德扶人閱讀 778評論 0 51
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,102評論 25 707
  • 父親是國民黨文書胰舆,母親是日本人骚露; 出生在遼寧鞍山,在祖父母的陪伴下缚窿,于澳門渡過年少時光棘幸; 之后被父母帶到香港,在這...
    小水珠在夢游閱讀 276評論 0 0
  • 桃花搖曳暗香浮倦零, 春夢了無痕跡實误续, 六年一萬八千多, 時光一去不復返扫茅。
    安詳?shù)您?/span>閱讀 234評論 0 3