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

2021-07-05 11:08:45 字數 2144 閱讀 5054

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

singleton.h

// 幫助實現單例設計模式

// .h檔案的實現

#define singletonh(methodname) + (instancetype)shared#

#methodname;

// .m檔案的實現

#if __has_feature(objc_arc) // 是arc

#define singletonm(methodname) \

static id _instace = nil; \

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

); \}\

return _instace; \}\

\- (id)init \

); \

return _instace; \}\

\+ (instancetype)shared#

#methodname \

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

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

#else // 不是arc

#define singletonm(methodname) \

static id _instace = nil; \

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

); \}\

return _instace; \}\

\- (id)init \

); \

return _instace; \}\

\+ (instancetype)shared#

#methodname \\\

- (oneway void)release \\\

- (id)retain \\\

- (nsuinteger)retaincount \

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

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

#endif

使用如下:

在某一.h檔案寫下面格式

// 單例類的宣告

@end

在相應的.m實現

// 單例類的實現

@end是不是很簡單,很方便,不需要寫那些繁瑣的**了!

#if __has_feature(objc_arc)  // 是arc

#endif

這段**是判斷arc和非arc的巨集。若在專案中有arc和mrc混編的話,那這段**可就派上用場了,比如:

// 定義乙個person類並例項化物件

person *person = [[person alloc] init];

// 非arc下進行釋放

#if !__has_feature(objc_arc) // 非arc

[person release];

#endif

這樣就實現了arc和mrc的混編了!

巨集定義抽取單例

ios單例設計模式中,我們可以發現,每乙個單例的寫法都是相同的,所以我們可以把他們抽取出來,放在乙個檔案中,當我們要定義乙個單例類的時候,就不用再寫重複的 了.下面就教大家用巨集定義抽取單例 建立乙個.h檔案,將相同的 用巨集定義定義 singleton.h 以後就可以使用inte cesingle...

單例模式的實現 ARC與非ARC

單例模式是一種很重要的設計模式,在ios開發中,通過使用單例設計模式來實現在程式生命週期內只有乙個例項存在來節省記憶體開銷。下面是arc中單例模式的實現 在自定義的類.m檔案中,需要實現下列的方法 import hmaudiotool.h inte ce hmaudiotool end implem...

單例模式 基類單例。。用於其他單例的派生

首先是繼承方式,為了進行單例的派生,需要將基類的建構函式以及拷貝賦值函式設定為protected成員 template class singleton singleton const singleton singleton operator const singleton public static...