Maison > Questions et réponses > le corps du texte
第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿
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;
}
ringa_lee2017-04-28 09:07:51
Ça y est, le premier est le code standard actuel du singleton ObjC.
+ (User *)shareUser {
static User *_sharedSingleton = nil; //静态全局变量
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init]; //dispatch once 保证大括号里的代码只执行一次
});
return _sharedSingleton;
}
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
@interface xxx : xxx
{
}
+ (instancetype)shareUser;
@end
Iciinstancetype
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.
高洛峰2017-04-28 09:07:51
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