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?

1voto

kevinlawler Punkte 910

KLSingleton ist:

  1. Untergliederbar (bis zum n-ten Grad)
  2. ARC-kompatibel
  3. Sicher mit alloc y init
  4. Faule Ladung
  5. Thread-sicher
  6. Sperrfrei (verwendet +initialize, nicht @synchronize)
  7. Makrofrei
  8. Ohne Zaubertrank
  9. Einfach

KLSingleton

0voto

TienDC Punkte 301

Mein Weg ist ganz einfach der folgende:

static id instanceOfXXX = nil;

+ (id) sharedXXX
{
    static volatile BOOL initialized = NO;

    if (!initialized)
    {
        @synchronized([XXX class])
        {
            if (!initialized)
            {
                instanceOfXXX = [[XXX alloc] init];
                initialized = YES;
            }
        }
    }

    return instanceOfXXX;
}

Wenn das Singleton bereits initialisiert ist, wird der LOCK-Block nicht eingegeben. Die zweite Prüfung if(!initialized) soll sicherstellen, dass es noch nicht initialisiert ist, wenn der aktuelle Thread die LOCK erwirbt.

0voto

Zolt Punkte 2681

Ich habe nicht alle Lösungen durchgelesen, also verzeihen Sie, wenn dieser Code redundant ist.

Dies ist meiner Meinung nach die sicherste Implementierung.

+(SingletonObject *) sharedManager
{
    static SingletonObject * sharedResourcesObj = nil;

    @synchronized(self)
    {
        if (!sharedResourcesObj)
        {
            sharedResourcesObj = [[SingletonObject alloc] init];
        }
    }

    return sharedResourcesObj;
}

0voto

JJD Punkte 47071

Um das Beispiel von @robbie-hanson zu erweitern ...

static MySingleton* sharedSingleton = nil;

+ (void)initialize {
    static BOOL initialized = NO;
    if (!initialized) {
        initialized = YES;
        sharedSingleton = [[self alloc] init];
    }
}

- (id)init {
    self = [super init];
    if (self) {
        // Member initialization here.
    }
    return self;
}

0voto

chunkyguy Punkte 3362

Mit Objective C-Klassenmethoden können wir die Verwendung des Singleton-Musters auf die übliche Art und Weise vermeiden, von:

[[Librarian sharedInstance] openLibrary]

zu:

[Librarian openLibrary]

indem man die Klasse in eine andere Klasse einbettet, die lediglich den Klasse Methoden Auf diese Weise besteht keine Gefahr, dass versehentlich doppelte Instanzen erstellt werden, da wir keine Instanz erstellen!

Ich habe einen ausführlicheren Blog geschrieben これ :)

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