iOS單例
1.單例模式是一種設(shè)計模式,為我們的程序提供一個公共的接口,即引入這個單例類的文件,我們不管在程序中的哪個地方聲明一個該類對象,其實都是同一個對象,啥都一樣。
2.單例模式的一般寫法
@interface SingleClass : NSObject
+(SingleClass *) shareInstance ;
@end
@implementation SingleClass
static SingleClass* instance = nil;
+(SingleClass*) shareInstance
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init] ;
}) ;
return instance ;
}
@end
SingleClass *class1 = [SingleClass shareInstance];
SingleClass *class2 = [SingleClass shareInstance];
以上兩個對象其實是單例的目的,但是我們在取單例聲明該單例對象的時候,必須以上邊這個靜態(tài)方法
但是下邊這種聲明對象的方法,其實在堆中alloc一個空間,與上邊就不是一個對象了,單例的目的就失效了,所以要這樣寫單例,必須保證每次聲明對象都用“shareInstance”方法
SingleClass *class3 = [[SingleClass alloc] init];
那么問題就來了,我們通過不同的途徑得到不同的對象,顯然是不行的。我們必須要確保對象的唯一性,所以我們就需要封鎖用戶通過alloc和init以及copy來構(gòu)造對象這條道路。我們知道,創(chuàng)建對象的步驟分為申請內(nèi)存(alloc)、初始化(init)這兩個步驟,我們要確保對象的唯一性,因此在第一步這個階段我們就要攔截它。當(dāng)我們調(diào)用alloc方法時,oc內(nèi)部會調(diào)用allocWithZone這個方法來申請內(nèi)存,我們覆寫這個方法,然后在這個方法中調(diào)用shareInstance方法返回單例對象,這樣就可以達(dá)到我們的目的??截悓ο笠彩峭瑯拥脑?,覆寫copyWithZone方法,然后在這個方法中調(diào)用shareInstance方法返回單例對象??创a吧:
static SingleClass* instance = nil;
@implementation SingleClass
+(SingleClass*) shareInstance
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
instance = [[self allocWithZone:NULL] init] ;
}) ;
return instance ;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [SingleClass shareInstance];
}
- (id)copy {
return [SingleClass shareInstance];
}
這樣的話,上邊的三個對象就完全一樣了,及同一個對象
下邊也是寫單例的一種放法
#import "SingleClass.h"
static SingleClass* instance = nil;
@implementation SingleClass
+(SingleClass*) shareInstance
{
@synchronized(self) {
if(!instance) {
instance = [[SingleClass alloc] init];
}
}
return instance ;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [SingleClass shareInstance];
}
- (id)copy {
return [SingleClass shareInstance];
}
@end