objective-c - oc单例的一些问题
给我你的怀抱
给我你的怀抱 2017-04-28 09:05:51
0
2
673

第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿

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;
    }

给我你的怀抱
给我你的怀抱

répondre à tous(2)
左手右手慢动作

Ç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.

小葫芦

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal