Comment convertir (ou créer) une classe singleton qui se compile et se comporte correctement lors de l'utilisation du comptage automatique de références (ARC) dans Xcode 4.2?
172
Comment convertir (ou créer) une classe singleton qui se compile et se comporte correctement lors de l'utilisation du comptage automatique de références (ARC) dans Xcode 4.2?
Réponses:
De la même manière que vous (auriez dû) déjà le faire:
la source
static
variables @David déclarées dans une méthode / fonction sont les mêmes qu'unestatic
variable déclarée en dehors d'une méthode / fonction, elles ne sont valides que dans le cadre de cette méthode / fonction. Chaque exécution séparée de la+sharedInstance
méthode (même sur des threads différents) "verra" la mêmesharedInstance
variable.si vous souhaitez créer une autre instance selon vos besoins, procédez comme suit:
sinon, vous devriez faire ceci:
la source
dispatch_once()
bit signifie que vous n'obtiendrez pas d'instances supplémentaires, même dans le premier exemple ...?[[MyClass alloc] init]
et contourner l'sharedInstance
accès. DongXu, vous devriez regarder l'article Singleton de Peter Hosey . Si vous prévoyez de remplacerallocWithZone:
pour empêcher la création de plus d'instances, vous devez également le remplacerinit
pour empêcher la réinitialisation de l'instance partagée.allocWithZone:
version. THX.Ceci est une version pour ARC et non-ARC
Comment utiliser:
MySingletonClass.h
MySingletonClass.m
la source
C'est mon modèle sous ARC. Satisfait au nouveau modèle utilisant GCD et satisfait également l'ancien modèle de prévention d'instanciation d'Apple.
la source
c1
une instance deAAA
la superclasse de 's? Vous devez appeler+alloc
surself
, passuper
.super
ne signifie pas l'objet de super-classe. Vous ne pouvez pas obtenir d'objet de super-classe. Cela signifie simplement acheminer les messages vers la version de super-classe de method.super
points encoreself
classe. Si vous souhaitez obtenir un objet de super classe, vous devez obtenir des fonctions de réflexion d'exécution.-allocWithZone:
method n'est qu'une simple chaîne à la fonction d'allocation du runtime pour offrir un point de remplacement. Donc finalement,self
pointer == objet de classe courant sera passé à l'allocateur, et finalement l'AAA
instance sera allouée.super
fonctionnement des méthodes de classe.Lisez cette réponse, puis lisez l'autre réponse.
Vous devez d'abord savoir ce que signifie un Singleton et quelles sont ses exigences, si vous ne le comprenez pas, vous ne comprendrez pas du tout la solution!
Pour créer un Singleton avec succès, vous devez être capable de faire les 3 suivantes:
dispatch_once_t
vous aide à résoudre une condition de concurrence en n'autorisant l'envoi de son bloc qu'une seule fois.Static
vous aide à «vous souvenir» de sa valeur à travers un nombre quelconque d'appels. Comment se souvient-il? Il ne permet pas de créer à nouveau une nouvelle instance portant le nom exact de votre sharedInstance, elle fonctionne uniquement avec celle qui a été créée à l'origine.Ne pas utiliser d' appel
alloc
init
(c'est-à-dire que nous avons toujours desalloc
init
méthodes puisque nous sommes une sous-classe NSObject, bien que nous ne devrions PAS les utiliser) sur notre classe sharedInstance, nous y parvenons en utilisant+(instancetype)sharedInstance
, qui est limité pour être lancé une seule fois , quelles que soient les tentatives multiples de différents threads en même temps et rappelez-vous sa valeur.Certains des singletons système les plus courants fournis avec Cocoa lui-même sont:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
Fondamentalement, tout ce qui aurait besoin d'avoir un effet centralisé devrait suivre une sorte de modèle de conception Singleton.
la source
Alternativement, Objective-C fournit la méthode d'initialisation + (void) pour NSObject et toutes ses sous-classes. Il est toujours appelé avant toute méthode de la classe.
J'ai défini un point d'arrêt dans un une fois dans iOS 6 et dispatch_once est apparu dans les cadres de la pile.
la source
Classe Singleton: Personne ne peut créer plus d'un objet de classe dans tous les cas ou de quelque manière que ce soit.
la source
Il y a deux problèmes avec la réponse acceptée, qui peuvent ou non être pertinents pour votre objectif.
Le code suivant prend en charge ces deux problèmes:
la source
J'espère que le code ci-dessus l'aidera.
la source
si vous avez besoin de créer un singleton en swift,
ou
vous pouvez utiliser de cette façon
la source