Wie konvertiere (oder erstelle) ich eine Singleton-Klasse, die bei Verwendung der automatischen Referenzzählung (ARC) in Xcode 4.2 kompiliert wird und sich korrekt verhält?
objective-c
ios
singleton
automatic-ref-counting
Cescofry
quelle
quelle
Antworten:
Genau so, wie Sie es bereits hätten tun sollen:
quelle
static
Variablen, die innerhalb einer Methode / Funktion deklariert wurden, sind dieselben wie einestatic
Variable, die außerhalb einer Methode / Funktion deklariert wurde. Sie sind nur im Rahmen dieser Methode / Funktion gültig. Jeder separater Lauf durch das+sharedInstance
Verfahren (auch auf verschiedene Threads) wird ‚sehen‘ die gleichesharedInstance
Variable.Wenn Sie nach Bedarf eine andere Instanz erstellen möchten, gehen Sie wie folgt vor:
Andernfalls sollten Sie Folgendes tun:
quelle
dispatch_once()
Bit bedeutet, dass Sie auch im ersten Beispiel keine zusätzlichen Instanzen erhalten ...?[[MyClass alloc] init]
densharedInstance
Zugriff ausführen und umgehen kann . DongXu, du solltest dir Peter Hoseys Singleton-Artikel ansehen . Wenn Sie überschreiben möchtenallocWithZone:
, um zu verhindern, dass weitere Instanzen erstellt werden, sollten Sie auch überschreibeninit
, um zu verhindern, dass die gemeinsam genutzte Instanz neu initialisiert wird.allocWithZone:
Version. Vielen Dank.Dies ist eine Version für ARC und Nicht-ARC
Wie benutzt man:
MySingletonClass.h
MySingletonClass.m
quelle
Dies ist mein Muster unter ARC. Erfüllt neue Muster mit GCD und erfüllt auch Apples altes Muster zur Verhinderung der Instanziierung.
quelle
c1
dass es sich um eine Instanz derAAA
Oberklasse handelt? Sie müssen rufen Sie+alloc
aufself
, nicht aufsuper
.super
bedeutet nicht das Super-Class-Objekt. Sie können kein Super-Class-Objekt abrufen. Dies bedeutet lediglich, dass Nachrichten an die Super-Class-Version der Methode weitergeleitet werden.super
Punkteself
Klasse noch. Wenn Sie ein erstklassiges Objekt erhalten möchten, benötigen Sie Laufzeitreflexionsfunktionen.-allocWithZone:
Methode ist nur eine einfache Kette zur Zuordnungsfunktion der Laufzeit, um einen übergeordneten Punkt zu bieten. Also letztlichself
Zeiger == aktuelles Klassenobjekt wird allocator weitergegeben werden, und schließlichAAA
wird Instanz zugewiesen werden.super
in Klassenmethoden funktioniert.Lesen Sie diese Antwort und lesen Sie dann die andere Antwort.
Sie müssen zuerst wissen, was ein Singleton bedeutet und welche Anforderungen er hat. Wenn Sie ihn nicht verstehen, werden Sie die Lösung überhaupt nicht verstehen!
Um einen Singleton erfolgreich zu erstellen, müssen Sie in der Lage sein, die folgenden 3 Schritte auszuführen:
dispatch_once_t
hilft Ihnen, eine Rennbedingung zu lösen , indem Sie den Block nur einmal versenden lassen.Static
hilft Ihnen, sich über eine beliebige Anzahl von Aufrufen an seinen Wert zu erinnern. Wie erinnert es sich? Es kann keine neue Instanz mit dem genauen Namen Ihrer sharedInstance erneut erstellt werden. Es funktioniert nur mit der ursprünglich erstellten.Nicht mit Aufruf
alloc
init
(dh wir haben nochalloc
init
Methoden , da wir eine NSObject Unterklasse sind, obwohl wir sie nicht verwenden sollen) auf unserer sharedInstance Klasse, wir dies erreichen durch die Verwendung+(instancetype)sharedInstance
, die nur begrenzt sein wird einmal ausgelöst , unabhängig von mehreren Versuchen von verschiedenen Threads zur gleichen Zeit und erinnern Sie sich an seinen Wert.Einige der häufigsten System-Singletons, die mit Cocoa selbst geliefert werden, sind:
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSFileManager defaultManager]
[NSBundle mainBundle]
[NSOperations mainQueue]
[NSNotificationCenter defaultCenter]
Grundsätzlich müsste alles, was einen zentralisierten Effekt haben müsste, einer Art Singleton-Entwurfsmuster folgen.
quelle
Alternativ bietet Objective-C die Initialisierungsmethode + (void) für NSObject und alle seine Unterklassen. Es wird immer vor allen Methoden der Klasse aufgerufen.
Ich habe einmal in iOS 6 einen Haltepunkt in einem gesetzt und dispatch_once wurde in den Stapelrahmen angezeigt.
quelle
Singleton-Klasse: Niemand kann auf jeden Fall oder auf irgendeine Weise mehr als ein Klassenobjekt erstellen.
quelle
Es gibt zwei Probleme mit der akzeptierten Antwort, die für Ihren Zweck relevant sein können oder nicht.
Der folgende Code behebt diese beiden Probleme:
quelle
Hoffe, dass der obige Code Abhilfe schafft.
quelle
Wenn Sie schnell Singleton erstellen müssen,
oder
Sie können diesen Weg verwenden
quelle