Ich verwende eine NSOperationQueue
und stehe Schlange NSOperationBlocks
. Nun haben Blöcke einen starken Hinweis auf alle Fälle in dem Block, und das anrufende Objekt hat auch einen starken Halt auf dem Block, so hat es geraten worden, so etwas wie die folgenden Funktionen ausführen:Schwache Referenzen innerhalb eines Blocks
__weak Cell *weakSelf = self;
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
UIImage *image = /* render some image */
/* what if by the time I get here self no longer exists? */
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[weakSelf setImageViewImage:image];
}];
}];
[self.renderQueue addOperation:op];
Also, meine Frage ist, sagen wir mal, dass das Cell
Objekt nicht mehr existiert, wenn das Bild fertig ist und die Zeile zurückkommt (es wurde freigegeben, möglicherweise aufgrund der Wiederverwendung von Zellen, was ein wenig schwierig zu formalisieren ist). Wenn ich gehe auf [weakSelf setImageViewImage:]
zugreifen, wird das einen EXC_BAD_ACCESS
Fehler verursachen?
Derzeit versuche ich zu verfolgen, was die Ursache meines Problems ist, und ich denke, dass es etwas damit zu tun haben könnte.
Hat die Zelle eine starke ref müssen renderQueue? Hat etwas anderes einen starken Bezug zu renderQueue? Wenn Sie die Ursache eines EXC_BAD_ACCESS verfolgen möchten, verwenden Sie einen interaktiven Debugger oder Instrumente. – outis
Die schwache Referenz sollte hier nicht benötigt werden. Unter der Annahme von ARC wird "op" am Ende der Methode, in der sich dieser Code befindet, freigegeben (sie wird auch von der Operationswarteschlange beibehalten/freigegeben, aber das ist im Moment irrelevant). Es würde nur einen Retain-Zyklus geben, wenn Sie sich auf dealloc von 'self' verlassen würden, um den Block freizugeben, d. H. Sie würden ihn in einem Ivar speichern. Das ist hier nicht der Fall, und Sie brauchen sich keine Sorgen zu machen, dass der Block sich selbst zurückhält. –
Wann gibt die Operation Queue den Artikel frei? Nachdem die Ausführung abgeschlossen ist, automatisch? Oder muss ich den Block manuell freigeben? Ich benutze ARC. – Snowman