我試圖在Objective-C中創(chuàng)建一個(gè)singleton類,該類也將在Swift中使用。我希望singleton實(shí)例可以作為屬性在Swift中訪問(wèn)。
蘋果似乎在NSFileManager
中做了類似的事情(盡管不是一個(gè)單一的例子)。
@property(class, readonly, strong) NSFileManager *defaultManager;
Ref: https://developer.apple.com/documentation/foundation/nsfilemanager/1409234-defaultmanager
以下是我迄今為止的(簡(jiǎn)化)嘗試:
FOOMyManager.h:
@interface FOOMyManager : NSObject
@property(class, readonly, strong) FOOMyManager *defaultManager;
- (instancetype)init NS_UNAVAILABLE;
@end
FOOMyManager.mm
@implementation FOOMyManager
+ (FOOMyManager *)defaultManager {
static dispatch_once_t s_once = 0;
static FOOMyManager *s_instance = nil;
dispatch_once(&s_once, ^{
s_instance = [[FOOMyManager alloc] initForDefaultManager];
});
return s_instance;
}
- (instancetype)initForDefaultManager {
self = [super init];
return self;
}
@end
我看到過(guò)類似模式的實(shí)例被用來(lái)創(chuàng)建singleton,使用
+ (instancetype)defaultManager;
但如果可能的話,我會(huì)明確地嘗試使用屬性。我的嘗試是“正確”的方式嗎?
是的,你有正確的原則。
您不需要
strong
,因?yàn)檫@是一個(gè)用于合成setter的屬性,告訴它應(yīng)該保留對(duì)傳遞到setter中的任何內(nèi)容的強(qiáng)引用。在這種情況下,它什么也沒做,因?yàn)轭悓傩詮膩?lái)不會(huì)自動(dòng)合成,而且它被標(biāo)記為readonly
,所以strong
無(wú)論如何都不會(huì)有任何效果。你的代碼看起來(lái)不錯(cuò)。
dispatch_once
是實(shí)例化單例的首選方式。就任何改進(jìn)而言,您可以向不可用屬性添加消息:
__attribute__((unavailable("Use FOOMyManager.defaultManager")))
。我不會(huì)說(shuō)這是必要的,也不會(huì)增加太多內(nèi)容,因?yàn)閺念^文件中可以清楚地看出要做什么,但我在這里將其作為一個(gè)選項(xiàng)。