2012-10-27 12 views
9

Ich habe eine Singleton-Klasse, die Daten sammelt, bis diese Daten in meine Datenbank geschrieben werden (wenn Sie wissen wollen, warum ich die Dinge auf diese Weise implementiere, siehe here). Nach dem Speichern der Daten möchte ich das Singleton zerstören. Wie kann ich das in ARC tun? Oder bin ich paranoid und muss ich es überhaupt zerstören?iOS: Wie kann ich einen Singleton in ARC zerstören? Sollte ich?

* Sie könnten sagen, dass dies ein Duplikat von this Frage ist, aber die akzeptierte Antwort hier ist nicht spezifisch genug, um hilfreich zu sein. Es heißt "Sie können eine Methode/Funktion, die Sie explizit aufrufen, deklarieren." Wie könnte der Code dafür aussehen? Wenn ich das Objekt nicht außerhalb einer Methode freigeben kann, wie kann ich es dann innerhalb einer Methode abziehen? Es sagt auch "Der einfachste Weg ist es, eine statische C++ - Klasse zu halten, dann geben Sie es in seinem Destruktor frei." Ich kenne C++ nicht, aber - können Sie wirklich eine C++ - Klasse in Ihren App-Code einfügen?

Mein Singleton ist wie so umgesetzt:

+(NHCFamilyStatus *)familyStatus 
{ 
    static dispatch_once_t pred; 
    static NHCFamilyStatus *familyStatusSharedObject=nil; 

    dispatch_once(&pred,^
    { 
     familyStatusSharedObject = [[NHCFamilyStatus alloc] init]; 
    }); 

    return familyStatusSharedObject; 
} 
+1

[Dieser Beitrag wird Ihnen helfen, es finden Sie als richtig Ihre Singleton implementieren] [1] [1]: http://stackoverflow.com/questions/7598820/correct-singleton- pattern-objective-c-ios – chrislhardin

+0

Warum zerstören Sie den Singleton und nicht nur den Puffer mit den Daten? – Jano

+0

@Jano Könnten Sie erklären, wie ich diesen Puffer zerstören könnte? – cmac

Antwort

19

Wenn Sie diese Singleton zerstören, werden Sie nie es in der Lage sein, wieder zu schaffen (das ist, was der dispatch_once Anruf bedeutet).

Sie nicht brauchen, um den Singleton zu zerstören. Auf jeden Fall haben Sie eine Methode auf dem Singleton, die alle Instanzvariablen entfernt, die Sie nicht mehr benötigen, aber Sie müssen nichts anderes tun.

+0

Hoppla, natürlich (re: dispatch_once). Verzeihen Sie, dass das Nullen der Instanzvariablen vor allem deshalb nützlich ist, weil es Speicher freisetzt? – cmac

+0

Ja, es setzt auch den Status zurück, seit Sie die Daten gespeichert haben, an denen Sie gearbeitet haben. – jrturton

+0

@jrturton Ich kann nicht sagen, ob deine Antwort besagt, dass es möglich ist, ein Singleton-Objekt zu zerstören. Du sagst "Du kannst diesen Singleton nicht zerstören" und dann sagst du "Du musst den Singleton nicht zerstören". Meine Erfahrung mit ihnen ist, dass es möglich ist, sie zu zerstören, nur ungewöhnlich, um solch ein Bedürfnis zu haben, und wie du erwähnt hast - du kannst es nicht neu erstellen, wenn es ursprünglich innerhalb eines dispatch_once() erstellt wurde. Ich versuche nur, eine klare Antwort zu bekommen, ich fordere Sie nicht heraus :) – pnizzle