网站普遍的创建单例类的方法有下面两种:
+ (instancetype)sharedManager {
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
+ (instancetype)sharedManager {
static id _sharedInstance = nil;
@synchronized(self) {
if (_sharedInstance == nil)
_sharedInstance = [[self alloc] init];
}
return _sharedInstance;
}
但是该如何避免意外的用[[alloc] init]
创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init
或者copy
的情况
黄舟2017-04-18 09:43:01
メソッドを見つけるためにもう一度 stackovweflow に行きました。これはシングルトン モードであるため、呼び出し元はシングルトンの要件に厳密に従い、統合インターフェイス (ここではsharedInstance) を通じてシングルトンを作成する必要があると思います。 no call [[class alloc] init] も正常にシングルトンを作成できます。[[class alloc] init] が発生した場合、Xcode はこのメソッドを使用できないという警告を表示する必要があると思います
。 リーリーPHPz2017-04-18 09:43:01
追加の作成が多数あり、これらの側面をオーバーロードしてsharedManagerインスタンスを返すか、例外を直接スローする新しいメソッドもあります。
迷茫2017-04-18 09:43:01
allocWithZone メソッドと copyWithZone メソッドをオーバーライドします。
alloc、copy、new のいずれを介しても、allocWithzone と copyWithzone を呼び出すことによってスペースが割り当てられるためです。
sharedManager メソッドのコードをこれら 2 つのメソッドに記述して、シングルトンの状況を最初から実現できます
大家讲道理2017-04-18 09:43:01
(instancetype)init {
@throw [NSExceptionExceptionExceptionWithName:@"Disable"reason:@"代わりに init を使用してください..." userInfo:nil];
return self;
}