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

Schreibe einen Kommentar