單例設計模式在各大編程語言中都是非常常見的,今天就簡單介紹一下IOS中單例的設計。
工具/原料
Xcode
方法/步驟
1、單例模式的作用
可以保證在程序運行過程,一個類只有一個實例,而且該實例易於供外界訪問;
從而方便地控制了實例個數,並節約系統資源
2、單例模式的使用場合
在整個應用程序中,共享一份資源(這份資源只需要創建初始化 1 次)
3、單例模式在 ARC\MRC 環境下的寫法有所不同,需要編寫 2 套不同的代碼
3.1 可以用宏判斷是否為 ARC 環境
#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif
3.2 ARC中,單例模式的實現
(1)在.m中保留一個全局的static的實例
static id _instance;
(2)重寫allocWithZone:方法,在這裡創建唯一的實例(注意線程安全)
+ (id)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self) {
if (!_instance) {
_instance = [super allocWithZone:zone];
}
}
return _instance;
}
(3)提供1個類方法讓外界訪問唯一的實例
+ (instancetype)sharedDemo
{
@synchronized(self) {
if (!_instance) {
_instance = [[self alloc] init];
}
}
return _instance;
}
3.3 非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟)
(1)實現內存管理方法
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1; }
- (oneway void)release {}
- (id)autorelease { return self; }
4、具體實現
4.1新建一個項目,名為“單例設計模式”
4.2新建一個名為“SingletonDemo”的類,繼承自“NSObject”
4.3在類的頭文件中設計一個創建單例對象的類方法:
+ (instancetype)sharedSingletonDemo;
4.4在類的.m文件中實現相應的方法
#import "SingletonDemo.h"
@implementation SingletonDemo
// 定義一個全局的static的實例
static id _instance;
/**
* 重寫allocWithZone:方法,在這裡創建唯一的實例
*/
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/**
* 提供一個給外部調用的實例化類方法
*/
+ (instancetype)sharedSingletonDemo
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
/**
* 為了考慮得更全面一些,把copy策略創建對象的方法也重寫一遍
*/
+ (id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
@end
注意事項
由於無法對代碼高亮顯示,另外又截了一份圖,請對照著看
如果您覺得這篇經驗有用的話,麻煩投上您寶貴的一票,當然您也可以收藏哦!