iOS開發(fā)中有很多種設(shè)計(jì)模式,這篇文章寫的是單例模式,其它設(shè)計(jì)模式后續(xù)會更新。。。
先來看看百度百科中對單例模式的定義:
單例模式是設(shè)計(jì)模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統(tǒng)中的唯一實(shí)例。要實(shí)現(xiàn)這一點(diǎn),可以從客戶端對其進(jìn)行實(shí)例化開始。因此需要用一種只允許生成對象類的唯一實(shí)例的機(jī)制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實(shí)例化過程。這個方法應(yīng)該是靜態(tài)方法(類方法),因?yàn)樽岊惖膶?shí)例去生成另一個唯一實(shí)例毫無意義。
1.第一句話說明了單例是一種設(shè)計(jì)模式,有很多人在面試被問到單例時經(jīng)常說:單例是一個對象,它在程序運(yùn)行中是唯一的。這是把單例的定義和作用混淆了,它的作用是保證程序運(yùn)行過程中對象的唯一性,所以這點(diǎn)需要注意。
2.后面說的就是如何實(shí)現(xiàn)單例了,其中提到需要創(chuàng)建一個靜態(tài)方法(類方法),這正是需要我們?nèi)プ龅?/p>
以下就是單例類中的寫法,單例的寫法有很多種,這里不一一介紹了
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+ (instancetype) singleton;
@end
#import "Singleton.h"
//創(chuàng)建一個靜態(tài)變量
static Singleton * instance = nil;
@implementation Singleton
//通過此類方法創(chuàng)建對象,保證唯一性
+ (instancetype)singleton {
//通過GCD實(shí)現(xiàn)對象只創(chuàng)建一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
//防止通過【[Singleton alloc] init]創(chuàng)建對象,因此需要重寫這個方法,
//因?yàn)檎{(diào)用alloc時會自動調(diào)用allocWithZone這個方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [Singleton singleton];
}
//防止通過copy和mutableCopy創(chuàng)建對象,安全起見,重寫以下兩個方法
- (id)copy {
return self;
}
- (id)mutableCopy{
return self;
}
@end
下面是測試代碼
//創(chuàng)建四個對象
Singleton * singleton1 = [Singleton singleton];
Singleton * singleton2 = [Singleton singleton];
Singleton * singleton3 = [Singleton singleton];
Singleton * singleton4 = [[Singleton alloc] init];
//打印內(nèi)存地址
NSLog(@"%p----%p----%p----%p",singleton1, singleton2, singleton3, singleton4);
測試結(jié)果

測試結(jié)果
從打印結(jié)果可以看出,四個地址是同一地址,說明對象是唯一的,單例類測試成功!??!