2011-09-26 5 views
0

Je connais 2 façons. Qu'est-ce qui est mieux? Et quelque chose de mieux que 2 façons?Quelle est la meilleure façon de partager une instance de classe (créer et partager un singleton)?

+ (MyClass *)shared { 
    /* 
    static MyClass *sharedInstance = nil; 

    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [[self alloc] init]; 
     } 
    } 
    return sharedInstance; 
    */ 

    /* 
    static dispatch_once_t pred; 
    static MyClass *sharedInstance = nil; 

    dispatch_once(&pred, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 

    return sharedInstance; 
    */ 
} 

Répondre

2

Voici une autre façon de configurer votre instance partagée. La sécurité des threads est gérée par le runtime et le code est très simple. C'est habituellement comment je configure mes singletons. Si l'objet singleton utilise beaucoup de ressources mais ne peut pas être utilisé alors l'approche de dispatch_once fonctionne bien.

static MyClass *sharedInstance = nil; 

+ (void) initialize 
{ 
    sharedInstance = [[MyClass alloc] init]; 
} 

+ (MyClass*)sharedInstance 
{ 
    return sharedInstance; 
} 
+0

Cela ne permet pas de configurer la classe avant que la méthode d'instance est créée. La méthode "dispatch_once" est la méthode généralement acceptée; Avoir une variété de façons légèrement différentes d'atteindre la même chose n'aide pas vraiment. – gnasher729

+0

Je ne vois pas pourquoi vous ne pourriez pas configurer la classe. Vous pouvez le configurer dans + load, + initialize (avant de créer sharedInstance). Vous pouvez même modifier certaines des propriétés sharedInstance plus tard dans le cycle de vie de l'application, le cas échéant. Peut-être que je ne vous ai tout simplement pas compris et, bien sûr, l'approche de dispatch_once fonctionnera. – aLevelOfIndirection

6

peut aussi créer une instance de votre classe dans AppDelegate et l'utiliser partout dans votre projet.

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

appappDelegate.<yourClassInstance> 
+0

J'ai aimé ça ... – Mrunal

+0

+1 pour approcher l'exigence en utilisant une instance d'un objet ordinaire, plutôt que d'appliquer une seule instance de type pour tous les clients. – justin

+0

N'utilisez pas le délégué d'application en tant que référentiel général pour toutes sortes de choses. Ce n'est pas ce qu'il est là pour ça. La méthode "sharedInstance" place proprement tout ce qui se rapporte à ce singleton dans un seul fichier. – gnasher729

1

Il suffit d'utiliser la version dispatch_once - il est fiable et propre. En outre, il fonctionnera également avec ARC - contrairement à l'approche suggérée ci-dessus.

1

Voici quelques détails

+ (YourClass *)sharedInstance 
{ 
    // structure used to test whether the block has completed or not 
    static dispatch_once_t p = 0; 

    // initialize sharedObject as nil (first call only) 
    __strong static id _sharedObject = nil; 

    // executes a block object once and only once for the lifetime of an application 
    dispatch_once(&p, ^{ 
     _sharedObject = [[self alloc] init]; 
    }); 

    // returns the same object each time 
    return _sharedObject; 
} 
Questions connexes