Singleton pattern:單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類膀哲。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問拗慨,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源豌鹤。如果希望在系統(tǒng)中某個類的對象只能存在一個沪袭,單例模式是最好的解決方案艇抠。
以上內(nèi)容來自百度百科默怨。
單例模式的基本思路:
- 為單例對象實現(xiàn)一個靜態(tài)實例讯榕,設(shè)置成 nil。
- 調(diào)用時檢查是否為 nil,是則創(chuàng)建否則直接使用愚屁。
- 修改alloc等方法济竹,預(yù)防被創(chuàng)建新實例。
- 本質(zhì)上霎槐,每次調(diào)用單例對象的實例方法送浊,就只是創(chuàng)建了指針來指向該單例對象已經(jīng)分配好的內(nèi)存。
Objective - C 實現(xiàn)單例方法1
- 在 .h 文件中加入類工廠方法:
#import <Foundation/Foundation.h>
@interface SingletonGeekBand : NSObject
+(SingletonGeekBand *)shared;
@end
- 在 .m 文件中加入方法實現(xiàn)丘跌。
#import "SingletonPattern.h"
// 建立靜態(tài)變量
static SingletonPattern * shared = nil;
@implementation SingletonPattern
// 類工廠方法袭景,如果 shared 還沒初始化則初始化,否則直接調(diào)用
+ (SingletonPattern *)shared {
// 確保單線程
@synchronized(self) {
if (shared == nil) {
shared = [[self alloc] init];
}
}
return shared;
}
// 重寫 alloc 方法闭树,確保不會被重新分配新的實例內(nèi)存耸棒。
+(instancetype)alloc {
@synchronized(self) {
if (shared == nil) {
shared = [super alloc];
return shared;
}
}
return shared;
}
// 重寫 allocWithZone
+ (id)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (shared == nil) {
shared = [super allocWithZone:zone];
return shared;
}
}
return nil;
}
// 重寫 copyWithZone
+ (id)copyWithZone:(NSZone *)zone {
return self;
}
@end
Objective - C 實現(xiàn)單例方法2
- 在 .h 文件中加入類工廠方法:
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+ (instancetype) shareInstance;
@end
- 在 .m 文件中加入方法實現(xiàn)。
#import "Singleton.h"
@implementation Singleton
+ (instancetype) shareInstance {
static dispatch_once_t dispatch = 0;
static Singleton * instance;
dispatch_once(&dispatch,^{
instance = [[Singleton hiddenAlloc] init];
});
return instance;
}
+ (instancetype)alloc {
return [self shareInstance];
}
+ (instancetype)hiddenAlloc {
return [super alloc];
}
@end
Swift 實現(xiàn)單例
基本思路:
- 把下面類方法復(fù)制到要實現(xiàn)單例的類當中报辱,并且將第1,4,7行的 ClassName 置換成類名稱与殃。
class func shareInstance() -> ClassName { // Change here!
struct SingletonStruct {
static var predicate: dispatch_once_t = 0
static var instance: ClassName? = nil // Change here!
}
dispatch_once(&SingletonStruct.predicate, {
SingletonStruct.instance = ClassName() // Change here!
}
)
return SingletonStruct.instance!
}
例如我創(chuàng)建了一個繼承自UIView的類,singletonView:
class SingletonView:UIView {
class func shareInstance() -> SingletonView {
struct SingletonStruct {
static var predicate: dispatch_once_t = 0
static var instance: SingletonView? = nil
}
dispatch_once(&SingletonStruct.predicate, {
SingletonStruct.instance = SingletonView()
}
)
return SingletonStruct.instance!
}
}
- 在使用到的位置創(chuàng)建兩個變量 testValueA捏肢,testValueB 通過 shareInstance 初始化并且調(diào)用奈籽。因為繼承自UIView,所以我可以調(diào)用所有UIView的方法鸵赫。而且衣屏,只要我改變了 testValue 當中的任何屬性,testValueB 也會一起更改辩棒。
注意單例在整個程序中只有一個狼忱,所以如果改變了其中一個變量的內(nèi)容,那另一個變量也會隨之改變一睁。
var testValueA = SingletonView.shareInstance()
testValueA.frame = CGRectMake(0, 0, 100, 100)
testValueA.backgroundColor = UIColor.blueColor()
var testValueB = SingletonView.shareInstance()
if testValueA == testValueB {
print("YES")
}