Der folgende Code stürzt ab, da der Inhalt von sentence
verschwindet, wenn der letzte Block beendet wird.
Was ist der richtige / idiomatische Weg, um das zu erreichen?
Ok, ich bin weggegangen und habe ein bisschen mit Xcode gespielt, und hier ist ein Modell von dem, was vor sich geht, das zu dem passt, was ich sehe.
Der Block, den ich oben benutzt habe, macht nichts Spezielles, aber der enumerateObjectsUsingBlock
Code scheint sein eigenes NSAutoreleasePool
zu haben, so dass das scheint, was verursacht hat, dass dealloc
für Objekte alloc'ed
aufgerufen wird. aber Autorelease im Block.
Der folgende Code entspricht im Verhalten dem, was ich oben sehe:
%Vor% Wenn ich das innerPool
-Objekt entferne, dann funktioniert der Code wie ich ursprünglich erwartet habe, und vermutlich wird der NSRunLoop
-Pool schließlich die verschiedenen NSString
-Objekte bereinigen.
HINWEIS: Dieser Thread ist jetzt das Google-Suchergebnis von Nummer 2 für 'enumerateObjectsUsingBlock Autorelease':
Google 'enumerateObjectsUsingBlock + Autorelease'
Das erste Ergebnis bestätigt diese Antwort. Danke allen.
Wie Sie bereits erwähnt haben, vermute ich, dass dieser Fehler auftritt, wenn der Autorelease-Pool ausgeführt wird, wie es wahrscheinlich in enumerateObjectsUsingBlock:
der Fall ist. Dies wird ärgerlich sein, wenn Sie eine __block
Variable haben. Sie können stattdessen einen NSMutableString verwenden oder einfach dies tun, der sowieso sauberer ist:
Wenn Sie alternativ ARC verwenden, sollte der Compiler das Problem für Sie beseitigen.
Tags und Links objective-c objective-c-blocks