2014-12-06 8 views
5

I wie unten Singleton-Instanz erschaffe:Möglichkeiten der Singleton Instanz aufgehoben immer automatisch

+(MySingleton*)sharedInstance {  
     static MySingleton sharedObject = nil; 

     static dispatch_once_t predicate = 0; 

    dispatch_once(&predicate, ^{ 
     sharedObject = [[MySingleton alloc] init]; 
    }); 
    return sharedObject; 
} 

Was sind die Möglichkeiten der sharedObject immer automatisch freigegeben?

Wie kann ich sicher sein, dass sharedObject im Speicher verbleibt, bis die App beendet wird?

Antwort

9

Als eine andere Antwort zu Recht betont, dieses gemeinsame Singleton wird nie freigegeben werden. Es gibt zwei Teile „Warum“, welche beide kommen aus der folgenden Zeile zu beantworten:

static MySingleton * sharedObject = nil; 

Zuerst static. static verändert innerhalb einer Funktion wie dieser die Lebenszeit einer Variablen und ändert sie von automatic, dem impliziten Standardwert, auf static. Dies bedeutet, dass diese Variable für die gesamte Lebensdauer des Programms existiert.

Zweitens macht diese Deklaration sharedObject eine starke Referenz. Variablen in Objective-C sind standardmäßig stark, aber pedantisch sein, die Sie geschrieben haben könnte:

static __strong MySingleton * sharedObject = nil; 

Also: wir eine Variable, die für die gesamte Dauer des Programms lebt (static), und das unterhält ein starke Bezugnahme auf das Objekt, das es darstellt (__strong). Mit diesen beiden Informationen und der Tatsache, dass Sie das Objekt, auf das die Variable verweist, niemals ändern, können Sie ableiten, dass sharedObject niemals freigegeben wird.

-6

sharedObject wird freigegeben, nachdem die enthaltenen Funktionen abgeschlossen und freigegebene Blöcke freigegeben wurden. so dass dispatch_once am wahrscheinlichsten running Block nach einmal ausgeführt wird. Das heißt, es wird gleich nach dem Aufruf von onece veröffentlicht.

+0

Mein Anliegen ist über alle Möglichkeiten, wo Singleton-Instanz automatisch freigegeben wird? –

+0

Das Objekt wird freigegeben, wenn keine starken Referenzen darauf vorhanden sind. Der Zeiger 'sharedObject' ist eine starke Referenz, deren Lebensdauer die gleiche ist wie die des gesamten Programms. Diese Antwort ist völlig falsch. –

+0

Sie haben ein grundlegendes Missverständnis darüber, wie ARC funktioniert. – Andy

3

0 Möglichkeit. Es wird nie veröffentlicht, static hält es mit starker Referenz. In der ARC-Welt kannst du nicht einfach etwas freigeben, ohne es vorher zu behalten.

+0

Da manuelle Freigabe und beibehalten in ARC verboten sind, ist dies sinnvoll. Vielen Dank. –

1

Ich stieß auf einen sehr zweifelhaften Fall, in dem es freigelassen werden kann und unglückliche Probleme verursachen kann, also während des ungewöhnlichen etwas vorsichtig zu sein.

Wenn eineine Sie seine Speicheradresse einer Dritte niedriges Niveau Bibliothek dh übergeben. als user_data (oder vielleicht eine Low-Level-C-Bibliothek, die Sie erstellt haben) und diese Bibliothek gibt den Speicher frei. Sie würden nicht erwarten, dass externe Bibliotheken von Ihnen bereitgestellte Benutzerdaten freigeben, aber das war der Fall bei einer Web-Sockets-c-Bibliothek, die ich verwendet habe.

Verwandte Themen