iOS開發(fā)中有很多種設計模式以政,這篇文章寫的是單例模式,其它設計模式后續(xù)會更新膛檀。。娘侍。
先來看看百度百科中對單例模式的定義:
單例模式是設計模式中最簡單的形式之一咖刃。這一模式的目的是使得類的一個對象成為系統(tǒng)中的唯一實例。要實現(xiàn)這一點憾筏,可以從客戶端對其進行實例化開始嚎杨。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問氧腰。使用工廠方法來限制實例化過程枫浙。這個方法應該是靜態(tài)方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義古拴。
1.第一句話說明了單例是一種設計模式箩帚,有很多人在面試被問到單例時經(jīng)常說:單例是一個對象,它在程序運行中是唯一的黄痪。這是把單例的定義和作用混淆了膏潮,它的作用是保證程序運行過程中對象的唯一性,所以這點需要注意满力。
2.后面說的就是如何實現(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實現(xiàn)對象只創(chuàng)建一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
//防止通過【[Singleton alloc] init]創(chuàng)建對象,因此需要重寫這個方法涩嚣,
//因為調(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é)果可以看出航厚,四個地址是同一地址顷歌,說明對象是唯一的,單例類測試成功a2恰C袖觥!