Maison > Questions et réponses > le corps du texte
网站普遍的创建单例类的方法有下面两种:
+ (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
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
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
PHPz2017-04-18 09:43:01
<🎜>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 <🎜>.
迷茫2017-04-18 09:43:01
<🎜>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<🎜>
大家讲道理2017-04-18 09:43:01
(instancetype)init {
@throw [NSException exceptionWithName:@"Disable" Reason:@"Veuillez utiliser init à la place..." userInfo:nil];
return self;
}
天蓬老师2017-04-18 09:43:01
Écrivez-le comme ça
static Singleton *slt = nil;
+ (instancetype)sharedInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
slt = [[self alloc]init];
});
return slt;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
slt = [super allocWithZone:zone];
});
return slt;
}
- (id)copyWithZone:(NSZone *)zone
{
return slt;
}