333 Stimmen

Wie sollte mein Objective-C-Singleton aussehen?

Meine Singleton-Accessor-Methode ist normalerweise eine Variante von:

static MyClass *gInstance = NULL;

+ (MyClass *)instance
{
    @synchronized(self)
    {
        if (gInstance == NULL)
            gInstance = [[self alloc] init];
    }

    return(gInstance);
}

Was könnte ich tun, um dies zu verbessern?

-5voto

deleted_user Punkte 3759

Die akzeptierte Antwort ist zwar kompilierbar, aber falsch.

+ (MySingleton*)sharedInstance
{
    @synchronized(self)  <-------- self does not exist at class scope
    {
        if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
    }
    return sharedInstance;
}

Laut Apple-Dokumentation:

... Sie können einen ähnlichen Ansatz wählen, um die Klassenmethoden der assoziierten Klasse zu synchronisieren, indem Sie das Class-Objekt anstelle von self verwenden.

Selbst wenn die Verwendung von "self" funktioniert, sollte das nicht der Fall sein, und das sieht für mich wie ein Fehler beim Kopieren und Einfügen aus. Die korrekte Implementierung für eine Klassenfabrikmethode wäre:

+ (MySingleton*)getInstance
{
    @synchronized([MySingleton class]) 
    {
        if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
    }
    return sharedInstance;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X