Singleton avec ARC
Ma question est la suivante: j'ai un singleton de type objet (je suis en utilisant l'ARC), qui a de ce code dans le fichier d'implémentation
+(id)sharedInstance
{
static DataManager *sharedInstance;
if (sharedInstance == nil) {
sharedInstance = [[DataManager alloc] init];
}
return sharedInstance;
}
+(NSManagedObjectContext *)getManagedContext
{
AppDelegate *applicationDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate];
return [applicationDelegate managedObjectContext];
}
+(void)saveContext:(NSManagedObjectContext *)context
{
NSError *error;
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
#pragma mark - Data management methods
+(void)addPersonWithName:(NSString *)name andPicture:(UIImage *)picture
{
NSManagedObjectContext *context = [self getManagedContext]; //no problem here
//some code
[self saveContex:context]; //no known class method for selector saveContext:
}
Pourquoi est-ce? La méthode est déclarée dans le .h fichier avec + ... le getManagedContext
modèle ne donne pas cette erreur????
S'il vous plaît montrer le .h fichier avec les déclarations de méthode
Ce n'est pas un singleton question - CocoaFu avait-il le droit (mais a supprimé la réponse): votre sélecteur manque un "t". il est utilisé comme
Ce n'est pas un singleton question - CocoaFu avait-il le droit (mais a supprimé la réponse): votre sélecteur manque un "t". il est utilisé comme
[self saveContex:
.OriginalL'auteur user1028028 | 2011-11-03
Vous devez vous connecter pour publier un commentaire.
Le mot-clé auto à l'intérieur d'une méthode références de la propriétaire de la méthode, qui est l'instance de l'objet, par exemple, des méthodes, et la classe pour les méthodes de classe. Cependant, le message
saveContex
manque un t à la fin (saveContext
).dispatch_once singleton
Et voici une meilleure singleton idiome compatible avec ARC:
Même code que Xcode modèle
Même code en tant que Xcode modèle avec des espaces réservés:
Même code + désactivé alloc/init/new
Voulez indice des utilisateurs qu'ils doivent appeler
sharedInstance
au lieu alloc/init/nouveau? Vous pouvez désactiver les méthodes avec l'attribut indisponible. Cela provoquera une erreur de compilation si l'une de ces méthodes est appelée sur la classe.Avertissement: dispatch_once n'est pas réentrant
Ne pas faire un appel récursif de
sharedInstance
de l'intérieur de ladispatch_once
bloc.Si vous appelez
dispatch_once
à partir de plusieurs threads, il agira comme une barrière empêchant l'accès simultané. Mais si vous l'appelez à nouveau dans le même fil à partir de l'intérieur du bloc il va se bloquer le fil. Cet exemple illustre bien le problème:+initialiser singleton
À l'aide de +initialiser est une alternative idiome pour créer un singleton. Avantages: Il est plusieurs fois plus rapide que
dispatch_once
. Inconvénients:+initialize
est appelée une fois par classe, donc si vous sous-classe singleton, une instance sera créée pour chaque classe parent. Ne l'utilisez que si vous connaissez le singleton va pas être sous-classé.Oui, ma réponse était manifestement mal, j'ai édité le haut après votre premier commentaire. Le singleton de la mise en œuvre est mieux avec dispatch_once_t, pas de conditions de course.
À l'aide d'une instance partagée pour un singleton mise en œuvre n'est pas "mieux" en quelque sorte. Je ne vois aucun problème dans l'utilisation de la classe directement. Si de toute façon n'est pas de "meilleur" ou "pire", afin de mettre en œuvre une véritable singleton, à l'aide de la classe directement certainement est "mieux" que d'utiliser une instance partagée.
Je n'ai pas compris désolé. En disant mieux se référant à dispatch_once je veux dire qu'il garantit qu'un seul thread va exécuter le bloc à la fois (même si c'est encore possible de blocage si le même thread appelle de nouveau à partir de l'intérieur du bloc).
Belle info, thnx !
OriginalL'auteur Jano