Was die Qualifikations tun:
__block
dieser Qualifier ermöglicht eine Schließung der Wert in der angegebenen Variablen gespeichert zu ändern.
__weak
ist eine Referenz auf ein Objekt, das nicht verhindert, dass das Objekt von der Zuweisung freigegeben wird.
__strong
ist eine Referenz auf ein Objekt, das verhindert verhindern, dass das Objekt nicht zugewiesen wird.
Was müssen Sie tun:
__weak
nicht tut, was Sie wollen, weil es nicht das Array nicht verhindern, dass De-zugewiesen, nachdem der aktuelle Umfang endet. Da Sie einen asynchronen Aufruf ausführen, verhindert nichts, dass die Laufzeit den vom Array verwendeten Speicher zurückfordert, bevor der Block ausgeführt wird.
__strong
wird das Objekt über das Ende des aktuellen Bereichs hinaus beibehalten. Das ist, was du willst.
__block
ermöglicht es Ihrem Block, die angegebene Variable zu ändern, dies wird jedoch nicht benötigt, wenn auf eine Instanzvariable verwiesen wird, da self
automatisch beibehalten wird.
In einer Umgebung mit Referenzzählung wird standardmäßig beibehalten, wenn Sie innerhalb eines Blocks auf ein Objective-C-Objekt verweisen. Dies gilt sogar für , wenn Sie einfach auf eine Instanzvariable des Objekts verweisen. Objekt Variablen, die mit dem Modifikator __block speichertyp markiert sind, werden jedoch nicht beibehalten.
Hinweis: Wenn Sie in einer Umgebung mit Garbage Collection sowohl __weak als auch __block-Modifizierer auf eine Variable anwenden, stellt der Block nicht sicher, dass er am Leben gehalten wird.Wenn Sie einen Block in der Implementierung einer Methode verwenden, sind die Regeln für die Speicherverwaltung von Objektinstanzvariablen subtilen:
Wenn Sie eine Instanz Variable durch Verweis zugreifen, selbst gehalten wird;
Ich denke, Ihr Problem hier liegt (relevante Teile in fett):
Sie können festlegen, dass eine importierte Variable sein wandelbar-das heißt, schreibschreib durch die __block Anwendung Modifikator für den Speichertyp. Der __block-Speicher ist dem register-, auto und statischen Speicher für lokale Variablen ähnlich, schließt sich aber gegenseitig aus.
__block-Variablen leben im Speicher, der zwischen dem lexikalischen Gültigkeitsbereich der Variablen und allen deklarierten Blöcken und Blockkopien oder im lexikalischen Gültigkeitsbereich der Variablen freigegeben ist. Somit wird der Speicher die Zerstörung des Stapelrahmens überleben, wenn Kopien der Blöcke, die innerhalb des Rahmens deklariert sind, über das Ende des Rahmens hinaus existieren (für beispielsweise, indem sie irgendwo für die spätere Ausführung in eine Warteschlange eingereiht werden). Mehrere Blöcke in einem gegebenen lexikalischen Bereich können gleichzeitig eine gemeinsame Variable verwenden.
Als eine Optimierung beginnt der Blockspeicher auf dem Stapel - genau wie Blöcke selbst tun. Wenn der Block mit Block_copy kopiert wird (oder in Objective-C, wenn dem Block eine Kopie gesendet wird), werden die Variablen in den Heap kopiert ( ). Somit kann die Adresse einer __block-Variablen über die Zeit geändert werden.
Es gibt zwei weitere Einschränkungen auf __block Variablen: Sie können nicht mit variabler Länge Arrays, und kann nicht Strukturen sein, die C99 enthalten Arrays variabler Länge.
Statt eines NSMutableArray
, versuchen, eine Ebene NSArray
+ (id)arrayWithObject:(id)anObject
mit verwenden.
Was passiert, wenn Ihr Fertigstellungsblock vollständig leer ist? Ich denke, das Problem mit dem ASIFormDataRequest, das nicht beendet wird, hat nichts damit zu tun, was Sie in diesem Block machen. –