溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS設(shè)計(jì)模式之單例模式

發(fā)布時(shí)間:2020-07-18 01:11:23 來(lái)源:網(wǎng)絡(luò) 閱讀:343 作者:dragon_cao 欄目:移動(dòng)開(kāi)發(fā)

1.基本概念

單例模式是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱(chēng)為單例類(lèi)的特殊類(lèi)。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn)。

單例設(shè)計(jì)模式確保對(duì)于一個(gè)給定的類(lèi)只有一個(gè)實(shí)例存在,這個(gè)實(shí)例有一個(gè)全局唯一的訪問(wèn)點(diǎn)。它通常采用懶加載的方式在第一次用到實(shí)例的時(shí)候再去創(chuàng)建它。

注意:蘋(píng)果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的這些方法都返回一個(gè)單例對(duì)象。


2.單例設(shè)計(jì)模式的適用情況

如果說(shuō)創(chuàng)建一個(gè)對(duì)象會(huì)耗費(fèi)很多系統(tǒng)資源,那么此時(shí)采用單例模式,因?yàn)橹恍枰粋€(gè)實(shí)例,會(huì)節(jié)省alloc的時(shí)間。

在IOS開(kāi)發(fā)中,如果很多模塊都要使用同一個(gè)變量,此時(shí)如果把該變量放入單例類(lèi),則所有訪問(wèn)該變量的調(diào)用變得很容易,否則,只能通過(guò)一個(gè)模塊傳遞給另外一個(gè)模塊,這樣增加了風(fēng)險(xiǎn)和復(fù)雜度

3.單例實(shí)例

新建一個(gè)接口類(lèi)Singleton繼承于NSObject:

@interface Singleton : NSObject

+ (Singleton *) sharedInstance;

@end


在實(shí)現(xiàn)類(lèi)中:

@implementation Singleton

//1.

static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

//2.

   if (sharedSingleton == nil) {

       sharedSingleton = [[Singleton alloc] init];

   }

   return sharedSingleton;

}

@end

1.聲明一個(gè)靜態(tài)變量去保存類(lèi)的實(shí)例,確保它在類(lèi)中的全局可用性。

2.此方法只會(huì)執(zhí)行一次,執(zhí)行過(guò)后在整個(gè)生命周期不再執(zhí)行,確保只有一個(gè)實(shí)例。

這種不能排除多線程的時(shí)候,同時(shí)調(diào)用出現(xiàn)的問(wèn)題,所以為了安全起見(jiàn)我們可以進(jìn)行改進(jìn)。有2種思路來(lái)解決這一問(wèn)題。

(1)使用關(guān)鍵字@synchronized進(jìn)行加鎖

@implementation Singleton


static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

   @synchronized(self)if{

   if (sharedSingleton == nil) {

       sharedSingleton = [[Singleton alloc] init];

   }

   return sharedSingleton;

   }

}

@end

(2)使用Dispatch_once,在整個(gè)生命周期中,只會(huì)調(diào)用一次

@implementation Singleton


static Singleton * sharedSingleton = nil;

+ (Singleton *) sharedInstance

{

   static dispatch_once_t once;    

        dispatch_once(&once,^{

        sharedSingleton = [[Singleton alloc] init];

   });

   return sharedSingleton;

}

@end


這樣在常用情況下都可以使用了。但這并不是一個(gè)“嚴(yán)格”的版本。具體情況參考這篇博文

http://blog.csdn.net/abel_tu/article/details/12836961






向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI