第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿
1.+ (User *)shareUser {
static User *_sharedSingleton = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}
2.static User *_sharedSingleton = nil;
@implementation User
(User *)shareUser {
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}
(id)allocWithZone:(NSZone *)zone
{
if (_sharedSingleton == nil) {
_sharedSingleton = [super allocWithZone:zone];
}
return _sharedSingleton;
}
(id)copyWithZone:(NSZone *)zone
{
return _sharedSingleton;
}
Ça y est, le premier est le code standard actuel du singleton ObjC.
Cette méthode de singleton est la forme standard en mode ARC (gestion automatique de la mémoire). Lors d'un appel externe, obtenez directement
[类名 shareUser]
Pensez à écrire l'interface dans le fichier h et n'utilisez pas_sharedSingleton
.xxx.h
Ici
instancetype
renvoie le type de la classe actuelle.Quant au deuxième morceau de code, l'écriture
static User *_sharedSingleton = nil;
en tant que variable globale est une méthode d'écriture à l'ère MRC, comprenant la réécriture(id)allocWithZone:(NSZone *)zone
et d'autres méthodes, qui est également une méthode d'écriture à l'ancienne.Le cycle de vie des variables statiques modifiées par le mot-clé static est le même. Elles sont initialisées au moment de la compilation et la mémoire ne sera libérée qu'à la sortie du programme ! Cependant, les variables ont une portée. Par exemple, dans votre première façon d'écrire, cette variable est une variable statique locale et ne peut être utilisée que dans cette méthode ! Quant à votre deuxième façon d'écrire, cette variable est une variable statique globale et peut être utilisée globalement