Erstellt die Referenzierung eines iOS-Anwendungsdelegaten in einem Block eine Kopie des Delegatobjekts?

8

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:

  1. Wird die Variable appDelegate wie bei normalen Blockregeln beim Verweisen auf Variablen innerhalb des Blocks auf den Stack kopiert?
  2. Wenn ja zu # 1, ist das eine gute / sichere Übung? Ich könnte sehen, dass dies möglicherweise Probleme verursacht, wenn Sie dies in einem Block getan haben, der anschließend an eine GCD-Warteschlange gesendet wurde, da .someNeatObject den Status / in Null geändert haben konnte?

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.

    
Matt S. 03.04.2014, 01:40
quelle

2 Antworten

5

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.

    
Sofi Software LLC 03.04.2014, 01:46
quelle
2

Die Retain-Anzahl wird inkrementiert. Abhilfe schaffen Sie mit dem Attribut __weak :

%Vor%     
Wayne Hartman 03.04.2014 01:48
quelle

Tags und Links