#import "bike.h"
@implementation
bike
+ (instancetype)sharedbike
); return bike;
}@end
相信大家一般都是這麼寫單例的,但是這樣寫有什麼弊端呢?假如我們的bike類需要和其它人的**有互動,其它人在使用bike類時,沒有認真看你的bike.h檔案,直接用了[[bike alloc] init];來生成例項,這時候與你當初設計bike為單例的初衷相悖了.那要怎麼解決這個問題呢?
在上述sharedbike方法中,生成bike類的例項時,其它呼叫了alloc方法(new最後也要呼叫alloc方法),其它人在呼叫的時候也用了alloc方法,那麼我們可不可以在alloc方法上做一下文章呢?答案是可以的.ios中類呼叫alloc方法時,其它是呼叫了:
+ (instancetype)allocwithzone:(struct _nszone *)zone;
這個方法,所以我們只需要在這個方法中做一下文章就可以了,**如下:
#import "bike.h"
@implementation
bike
+ (instancetype)sharedbike
+ (instancetype)allocwithzone:(struct _nszone *)zone
); return bike;
}@end
上述**即能保證通過sharedbike和[[bike alloc] init]方法得到的類都是同乙個類.到這一步是不是覺得這種寫法就已經ok了?不,不,不,你有沒有考慮過copy與mutable時還能保證得到的是仍然是同乙個單例,上**:
#import "bike.h"
@inte***ce
bike ()
@end
@implementation
bike
static bike *bike;
+ (instancetype)sharedbike
+ (instancetype)allocwithzone:(struct _nszone *)zone
); return bike;
}- (instancetype)copywithzone:(nszone *)zone
- (instancetype)mutablecopywithzone:(nszone *)zone
@end
說完單例的建立,我們說說單例的銷毀.世間萬物,有生必有死.假如我們自己建立的一些單例類,需要內嵌到別人的工程中,而且在別人的工程中只有某種場景下,才會呼叫我們的單例類,再或者我們的單例類有很多屬性,有乙個socket保持與後台的常連線等,總之就是比較耗資源,我們希望我們的類在其它工程中如果不用了就銷毀掉,這樣可以節省資源.
在上述單例的**中有乙個oncetoken變數,在單例生成之前oncetoken = 0,在單例生成之後oncetoken = -1了,之後一直保持-1這個值,知道這個之後我想你應該有思路了,**如下:
@implementation
bike
static bike *bike;
static
dispatch_once_t oncetoken;
- (void)destroysingleton
iOS單例模式物件的建立及銷毀
import ns assume nonnull begin inte ce user nsobject 單例方法 return 返回單例物件 instancetype sharedinstance 銷毀物件 void attempdealloc 登入名 property nonatomic,cop...
iOS 建立單例
instancetype sharedinstance return instance 重寫該方法是防止物件通過 alloc 方法建立會產生新的物件 官方解釋 alloc 由於歷史原因會呼叫 allocwithzone 方法 instancetype allocwithzone struct nsz...
iOS中的單例建立
很多人實現單例會這樣寫 implementation xxclass id sharedinstance return sharedinstance 相比之下 implementation xxclass id sharedinstance return sharedinstance 使用dispa...