ARC Verwandte crash in iOS bei Verwendung eines block-pointer als member-variable
Kann jemand bitte helfen Sie mit BOGEN-und Speicher-bezogene Abstürze?
Ich habe Klasse LTRequest
mit einer member-variable, die speichert einen block Zeiger:
typedef void (^APICallOKBlock)(id);
@interface LTRequest : NSObject
@property (nonatomic, strong) APICallOKBlock okCB;
@end
Den code zum initialisieren Sie die variable:
-(void)addOKBlock:(APICallOKBlock)okBlock
{
self.okCB = okBlock;
}
Rufe ich den block im Falle des Erfolgs:
-(void)apiCallCompletedWithResult:(id)result
{
if(self.okCB != nil)
{
self.okCB(result);
}
}
Referenz, der block sieht ungefähr so aus:
APICallOKBlock okBlock = ^(id result)
{
[self handleAPICallCompleted:result];
};
Ruft es eine Funktion definiert, in der das Objekt geplant, dass der api-Aufruf, aber der Teil ist nicht wichtig. Wichtig ist, was passiert, wenn apiCallCompletedWithResult
aufgerufen wird, nachdem die api-Aufruf erfolgreich war. Und was passiert, ist, dass der block aufgerufen wird, aber die app stürzt ab, kurz danach, wenn das request-Objekt LTRequest
wird aufgehoben (SomeAppName ist unsere Anwendung):
Thread 6 name: Dispatch queue: com.apple.root.low-priority
Thread 6 Crashed:
0 libobjc.A.dylib 0x300bad9c objc_release + 12
1 libobjc.A.dylib 0x300c6c00 objc_storeStrong + 24
2 SomeAppName 0x00055688 -[LTRequest .cxx_destruct] (LTRequest.m:12)
3 libobjc.A.dylib 0x300bba66 object_cxxDestructFromClass + 50
4 libobjc.A.dylib 0x300bba2c object_cxxDestruct + 8
5 libobjc.A.dylib 0x300b99ac objc_destructInstance + 20
Habe ich versucht zu verwenden unsafe_unretained
statt strong
zum speichern des Blocks in die LTRequest
Objekt:
@property (nonatomic, unsafe_unretained) APICallOKBlock okCB;
In diesem Fall der Absturz passiert exakt in der Zeile mit der if:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x300b9eda objc_retain + 10
1 libobjc.A.dylib 0x300c6bde objc_retainAutoreleasedReturnValue + 34
2 SomeAppName 0x00054f90 -[LTRequest apiCallCompletedWithResult:] (LTRequest.m:84)
3 SomeAppName 0x0002f8aa __29-[LTServerProxy makeAPICall:]_block_invoke_0 (LTServerProxy.m:154)
//file LTRequest.m
line 84 if(self.okCB != nil)
line 85 {
line 86 self.okCB(result);
line 87 }
Bin ich mit dem Zeiger auf einen block richtig und wie soll ich es nennen, verursacht keine Abstürze?
Einige Infos: ich bin mit iOS SDK 5.0, Bereitstellung Ziel ist 4.0, Geräte iPhone und ARC aktiviert ist für das gesamte Projekt.
InformationsquelleAutor Amiramix | 2012-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst, das Eigentum
copy
eher alsretain
:blog.refractalize.org/post/10476042560/... hat ein paar Notizen auf, warum dies der Fall ist, und ein link zu einer noch ausführlicheren Artikel.
Dies hat mich gerettet! Ich hatte ein NSNumber, hatte ich versehentlich als nonatomic, assign statt nonatomic, strong! Großen Unterschied! Danke!
Sie haben mich gerettet 😛
InformationsquelleAutor mattjgalloway
Kopieren Sie den block beim speichern die Instanz der Klasse Instanz.
InformationsquelleAutor dtuckernet