您好,登錄后才能下訂單哦!
1.基本概念
單例模式是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱(chēng)為單例類(lèi)的特殊類(lèi)。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn)。
注意:蘋(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
免責(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)容。