Betrachten Sie das folgende Beispiel:
%Vor%Wenn Sie davon ausgehen, dass der Completion-Block auf dem Haupt- / UI-Thread ausgeführt wird, um zusätzlichen Irrsinn zu vermeiden, bin ich mir nicht sicher:
Ich nehme zur Kenntnis, dass das appDelegate nicht überstrapaziert werden sollte, aber es ist nützlich, um Informationen über den aktuellen Status der Anwendung zu halten, wie z. B. Core Data-bezogene Objekte, wenn Sie Apple-Vorlagen zum Initialisieren eines Core Data-Stacks verwenden mindestens bei iOS-Projekten). Dieser spezielle Fall (Core Data) hat mich betroffen, da ein Großteil dieses Stapels nicht Thread-sicher ist, noch ist es eine gute Idee, es zu kopieren.
Vielen Dank im Voraus.
Ihr Beispiel wird nicht kompiliert, da der Delegat nicht definiert ist. Ich nehme an, Sie meinen "SomeNeatObject * object = appDelegate.someNeatObject;"
In diesem Beispiel ist appDelegate eine Variable, deren Wert vom Block erfasst wird. Es ist nicht anders als jede andere Variable.
Es ist nicht unsicher, weil [[UIApplication sharedApplication] -Delegat] immer dasselbe zurückgibt, es sei denn, Sie ändern den Delegaten, was Sie wahrscheinlich nicht tun.
Die grundlegenden Konzepte sind: appDelegate ist eine Variable , die Punkte auf ein Objekt verweist (oder verweist) (oder Instanz) vom Typ AppDelegate . In einer iOS-App gibt es eine solche Instanz, die von [[UIApplication sharedApplication] delegate] zurückgegeben wird. Wenn Sie in einem Block einen Verweis auf appDelegate erstellen, erstellen Sie eine Kopie der Variablen, nicht des Objekts. Also in deinem Code-Block:
%Vor%Dies ist semantisch das Gleiche wie das Einfügen des folgenden Codes in den Block (Umwandlungen weggelassen):
%Vor%Die SomeNeatObjects, auf die verwiesen wird, sind dasselbe.
Etwas weiter fortgeschrittenes Konzept: Jedes Objekt hat eine Adresse im Speicher (eine ganze Zahl, normalerweise in hexadezimaler Darstellung). Wenn zwei Variablen denselben hexadezimalen Wert haben, zeigen sie auf dasselbe Objekt. Wenn sie unterschiedliche Werte haben, zeigen sie auf verschiedene Objekte. In Ihrem Beispiel haben appDelegate (außerhalb des Blocks) und appDelegate (innerhalb des Blocks) denselben Wert und verweisen daher auf dasselbe Objekt.
Wenn Sie das tun würden:
%Vor%Dann würden Sie eine Kopie des Objekts erstellen, auf das appDelegate zeigt. Aber tu das bitte nicht.
Die Retain-Anzahl wird inkrementiert. Abhilfe schaffen Sie mit dem Attribut __weak
:
Tags und Links objective-c ios macos