iOS使用巨集寫單例

2021-09-09 02:16:52 字數 3318 閱讀 7429

本文只介紹arc情況下的單例

過去一直背不下來單例如何寫,就是知道這麼回事,也知道通過巨集來寫單例,但是一直記不住,今天就來記錄一下

- (void)viewdidload
建立person,列印,實際上是2個物件。沒毛病.

建立方法

#import "siperson.h"

static siperson *instance_ = nil;

@implementation siperson

///方法1,快速建立物件

+ (instancetype)sharedinstance);

return instance_;

}///方法2.這個方法一定要有,就是alloc] init]方法,一定會呼叫這個方法

+ (instancetype)allocwithzone:(struct _nszone *)zone);

return instance_;

}@end

//此處還應該有乙個+ copy方法,因為可能是copy,那麼有可能是生成新的方法

方法12都要實現,才能是單例。假如方法2沒有實現,通過sharedinstance實現的確實是乙個單例,但是通過alloc] init]有生成了另乙個物件

2016-09-17 14:17:45.086 sharedinstance[9158:611161] 2016-09-17 14:17:45.087 sharedinstance[9158:611161]
如果你的物件將來可能還要呼叫copy(應該宣告協議),那麼你應該還要實現乙個方法

- (id)copywithzone:(nszone *)zone
copy的時候,一般是生成了乙個新的物件,所以不是單例了,但是用的時候比較少,不是特別需要的,可以不實現這個方法,為毛要這樣去寫?因為他是物件方法,instance_裡面有值

[super viewdidload];

siperson *person = [siperson sharedinstance];

nslog(@"%@",person);

siperson *person1 = [[siperson alloc] init];

nslog(@"%@",person1);    

siperson *person2 = [person1 copy];

nslog(@"%@",person2);

結果如下

*  在.**件中定義的巨集,arc

* *  sisingletonh(name) 這個是巨集

*  + (instancetype)shared##name;這個是被代替的方法, ##代表著shared+name 高度定製化

* 在外邊我們使用 「sisingletonh(gege)」 那麼在.**件中,定義了乙個方法"+ (instancetype)sharedgege",所以,第乙個字母要大寫

* *  @return 乙個搞定好的方法名

*/#define sisingletonh(name) + (instancetype)shared##name;

/** *  在.m檔案中處理好的巨集 arc

* *  sisingletonm(name) 這個是巨集,因為是多行的東西,所以每行後面都有乙個"\",最後一行除外,

* 之所以還要傳遞乙個「name」,是因為有個方法要命名"+ (instancetype)shared##name"

*  @return 單利

*/#define sisingletonm(name) \

static siperson *instance_ = nil;\

+ (instancetype)shared##name);\

return instance_;\

}\+ (instancetype)allocwithzone:(struct _nszone *)zone);\

return instance_;\

}\- (id)copywithzone:(nszone *)zone

實際使用

//.**件sisingletonh(default)
//.m檔案sisingletonm(default)
都是一句話,都沒有符號(定義的時候就給了符號),就這麼簡單

在實際使用的時候

[super viewdidload];

siperson *person = [siperson shareddefault];

nslog(@"%@",person);

siperson *person1 = [[siperson alloc] init];

nslog(@"%@",person1);

siperson *person2 = [person1 copy];

nslog(@"%@",person2);

//列印結果

2016-09-17 14:56:39.508 sharedinstance[9292:633076] 2016-09-17 14:56:39.508 sharedinstance[9292:633076] 2016-09-17 14:56:39.508 sharedinstance[9292:633076]

拿來就可以使用的檔案位址

簡單說一下如何定義swift版本的單例,正常寫,沒研究過單例

iOS單例巨集

define singletonh methodname instancetype shared methodname if has feature objc arc 是arc define singletonm methodname else 不是arc define singletonm met...

69 單例使用巨集實現

1 判斷是否是arc環境 可以用巨集判斷是否為arc環境 if has feature objc arc arc else mrc endif 2 定義巨集的時候字串連線 連線字串和引數 define singleton h name instancetype shared name 1 在arc和...

使用巨集來實現單例模式

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。如果有很多地方需要使用到單例模式,則可以改用...