网站普遍的创建单例类的方法有下面两种:
+ (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
的情况
http://www.jianshu.com/p/08b1...
Consultez mon article de blog.
Je suis retourné sur stackovweflow pour trouver une méthode. Je pense que comme il s'agit d'un mode singleton, l'appelant doit suivre strictement les exigences du singleton et créer un singleton via une interface unifiée (ici sharedInstance), et il devrait y avoir aucun appel [ [class alloc] init] ne peut également créer avec succès une seule instance Si [[class alloc] init] se produit, je pense que Xcode devrait avertir que cette méthode ne peut pas être utilisée
Il existe de nombreuses créations supplémentaires, et il existe également une nouvelle méthode surcharger ces aspects pour renvoyer une instance sharedManager, ou lancer une exception directement .
Remplacez les méthodes allocWithZone et copyWithZone. Parce que que ce soit via alloc, copy ou new, l'espace est alloué en appelant allocWithzone et copyWithzone. Vous pouvez écrire le code de la méthode sharedManager dans ces deux méthodes, et vous pouvez réaliser la situation singleton à partir de zéro
(instancetype)init {
@throw [NSException exceptionWithName:@"Disable" Reason:@"Veuillez utiliser init à la place..." userInfo:nil];
return self;
}
Écrivez-le comme ça