IOS中單例的設計?

Tags: 中單, 單例,

單例設計模式在各大編程語言中都是非常常見的,今天就簡單介紹一下IOS中單例的設計。

工具/原料

Xcode

方法/步驟

1、單例模式的作用

可以保證在程序運行過程,一個類只有一個實例,而且該實例易於供外界訪問;

從而方便地控制了實例個數,並節約系統資源

2、單例模式的使用場合

在整個應用程序中,共享一份資源(這份資源只需要創建初始化 1 次)

3、單例模式在 ARC\MRC 環境下的寫法有所不同,需要編寫 2 套不同的代碼

3.1 可以用宏判斷是否為 ARC 環境

#if __has_feature(objc_arc)

// ARC

#else

// MRC

#endif

IOS中單例的設計

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;

}

IOS中單例的設計

3.3 非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟)

(1)實現內存管理方法

- (id)retain { return self; }

- (NSUInteger)retainCount { return 1; }

- (oneway void)release {}

- (id)autorelease { return self; }

IOS中單例的設計

4、具體實現

4.1新建一個項目,名為“單例設計模式”

IOS中單例的設計

4.2新建一個名為“SingletonDemo”的類,繼承自“NSObject”

IOS中單例的設計

IOS中單例的設計

IOS中單例的設計

4.3在類的頭文件中設計一個創建單例對象的類方法:

+ (instancetype)sharedSingletonDemo;

IOS中單例的設計

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

IOS中單例的設計

IOS中單例的設計

注意事項

由於無法對代碼高亮顯示,另外又截了一份圖,請對照著看

如果您覺得這篇經驗有用的話,麻煩投上您寶貴的一票,當然您也可以收藏哦!

相關問題答案