Singleton mit ARC
Meine Frage ist folgende: ich habe ein singleton-Objekt geben (ich bin mit ARC), diesen code in der Umsetzung Datei
+(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:
}
Warum ist das so? Die Methode deklariert wird .h-Datei, mit + ... der getManagedContext
Modell nicht mit diesem Fehler??????
InformationsquelleAutor der Frage user1028028 | 2011-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Schlüsselwort selbst innerhalb einer Methode verweist auf die Eigentümer der Methode, die die Instanz ist, die das Objekt für die Instanz-Methoden und die Klasse für die Klasse Methoden. Jedoch, die Nachricht
saveContex
fehlt ein t am Ende (saveContext
).dispatch_once singleton
Und hier ist eine bessere singleton-idiom kompatibel mit ARC:
Gleichen code wie Xcode-Vorlage
Denselben code wie eine Xcode-Vorlage mit Platzhaltern:
Gleichen code + deaktiviert alloc/init/neue
Wollen Hinweis die Benutzer, die Sie anrufen sollte
sharedInstance
statt alloc/init/neue? Sie können deaktivieren Sie die Methoden mit dem Attribut " nicht verfügbar. Dies führt zu einer compiler-Fehlermeldung, wenn eine dieser Methoden aufgerufen wird, die auf die Klasse.Warnung: dispatch_once ist nicht reentrant
Machen Sie nicht einen rekursiven Aufruf
sharedInstance
aus dem inneren derdispatch_once
block.Wenn Sie anrufen
dispatch_once
aus mehreren threads, die es fungiert als ein Hindernis für den gleichzeitigen Zugriff. Aber wenn Sie rufen es wieder in dem selben thread, aus in den block, es wird deadlock thread. Dieses Beispiel veranschaulicht das problem:+initialisieren singleton
Mit +initialisieren ist eine alternative idiom zum erstellen einer singleton. Vorteile: Es ist um ein Vielfaches schneller als
dispatch_once
. Nachteile:+initialize
heißt einmal pro Klasse, so dass, wenn Sie eine Unterklasse der singleton ist, wird eine Instanz erstellt werden, die für jede übergeordnete Klasse zu. Verwenden Sie es nur, wenn Sie wissen das singleton nicht untergeordnet.InformationsquelleAutor der Antwort Jano