單例模式的實現 ARC與非ARC

2021-07-01 18:16:39 字數 2100 閱讀 9090

單例模式是一種很重要的設計模式,在ios開發中,通過使用單例設計模式來實現在程式生命週期內只有乙個例項存在來節省記憶體開銷。

下面是arc中單例模式的實現**:

在自定義的類.m檔案中,需要實現下列的方法

#import

"hmaudiotool.h"

@inte***ce

hmaudiotool

()@end

@implementation

hmaudiotool

定義乙份變數

(整個程式執行過程中,只有

1份)static

id_instance;

- (id

)init);}

return

self;}

/*** 

重寫這個方法

:控制記憶體記憶體

*/+ (

id)allocwithzone:(

struct

_nszone

*)zone

);//

返回物件

return

_instance;}

+ (instancetype

)sharedaudiotool

);//

返回物件

return

_instance;}

@end

通過重寫allocwithzone,copywithzone,以及init方法來實現在記憶體中只存在乙個hmaudiotool物件.

上面的**是arc下單例的實現,而對於非arc而言,還需要重寫release,autorelease,retain,retaincount來保證返回的物件為單例,**如下:

+ (id

)copywithzone:(

struct

_nszone

*)zone

- (oneway

void

)release

- (instancetype

)autorelease

- (instancetype

)retain

- (nsuinteger

)retaincount

通過重寫上面五個方法來確保單例物件在非arc下存在。

實際開發中,我們可以將這些**抽取到乙個標頭檔案裡面以巨集定義的方式來呼叫.

// ## :

連線字串和引數

#define singleton_h(name) + (instancetype)shared##name;

#if __has_feature(objc_arc)

// arc

#define singleton_m(name) \

static id _instance; \

+ (id)allocwithzone:(struct _nszone *)zone \

); \

return _instance; \

} \\

+ (instancetype)shared##name \

)return

_instance; \

} \+ (

id)copywithzone:(

struct

_nszone *)zone \

#else//非

arc#define singleton_m(name) \

static id _instance; \

+ (id)allocwithzone:(struct _nszone *)zone \

); \

return _instance; \

} \\

+ (instancetype)shared##name \

); \

return _instance; \

} \\

- (oneway void)release \ \\

- (id)autorelease \ \\

- (id)retain \ \\

- (nsuinteger)retaincount \ \\

+ (id)copywithzone:(struct _nszone *)zone \

#endif

oc非ARC機制實現單例模式

static kit kit nil implementation kit instancetype allocwithzone struct nszone zone return kit instancetype init return kit 此類方法等價於 類名 alloc init inst...

ARC與非ARC混用

隨著arc管理記憶體技術的日漸成熟,人們慢慢傾向於在自己的專案裡使用arc。由於原先一直都是手動管理記憶體的,所以就要考慮怎麼樣在非arc的工程裡用使用arc進行編譯的檔案 類庫。好在這樣的混用十分的簡單。只要對相應的檔案進行一項簡單的設定就成。操作步驟如下 1 選擇專案中的targets,選中你所...

單例巨集的抽取(用於ARC和非ARC)

在專案開發,難免會用到單例,也就是singleton,一旦建立單例,除非完全將程式退出,否則單例物件會一直存在!開發中,也許我們會使用多個單例,但一次次建立又很麻煩,但萬一遇到mrc 與 arc混編,再設定單例會更頭疼!這裡是乙個單例巨集的抽取,寫入到.h檔案,使用時,匯入該檔案即可!singlet...