Cocoa-Touch: performSelectorOnMainThread: seltsames Verhalten + Absturz

Ich habe eine Situation, in der ich faul bin, Bilder aus dem WWW zu laden.
Es handelt sich um eine Liste von Elementen. Wenn Sie auf ein Element tippen, wird eine Detailansicht an einen Navigationscontroller gesendet.

In dieser Detailansicht verfügt der Artikel über ein Bild, bei dem es sich zunächst um ein Standardbild handelt, und ich möchte damit beginnen, das Bild von einer URL zu laden.

Ich erstelle also ein Objekt, das nach der Initialisierung einen neuen Thread löst, der wiederum den Inhalt lädt und anschließend meine Ansicht benachrichtigt, dass die Daten geladen werden:

// in MyLoader:
- (MyLoader *)initWithUrl:(NSURL *)url requester:(id)requester {
    self.url = url;
    self.requester = requester; // both are nonatomic, retain properties
    [self performSelectorInBackground:@selector(loadIt) withObject:nil];
}

- (void)loadIt {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSData *data = [NSData dataWithContentsOfURL:url];
    [requester performSelectorOnMainThread:@selector(dataReady) withObject:data waitUntilDone:YES;
    [arp release];
}

// in MyRequester:
- (void)somewhere {
    MyLoader *loader = [[[MyLoader] alloc] initWithUrl:someUrl requester:self] autorelease];
    // then I retain loader somewhere, it's more complicated but I have verified that it's properly retained.
}

Ein paar Anmerkungen:

Zuerst dachte ich, es könnte ein Problem mit einigen Variablen geben. Ich habe direkt zuvor einen Haltepunkt gesetztperformSelectorOnMainThread und bestätigte dasdata undrequester waren beide ok

Dann dachte ich, es wurde durch die Weitergabe der NSData über die Threads verursacht, also habe ich geändertwithObject:nil. Es stürzt immer noch ab.

Als ich weiter nachforschte, war der Absturz sehr seltsam. Ich spezifiziertewaitUntilDone:YESIch habe einen Haltepunkt in derrequester'sdataReady. Aber dieperformSelectorOnMainThread call gibt zurück (es erreicht den Haltepunkt danach), ohne den Haltepunkt im Inneren zu erreichendataReady. Übrigens,- (void)dataReady:(NSData*)Der Körper enthält vorerst nurint x = 1; (um einen Haltepunkt zu setzen). Außerdem habe ich versucht einzustellenwaitUntilDone:NO, es stürzt immer noch ab.

Die Auswahlfunktion wird nicht ausgeführt (der Haltepunkt wird nicht erreicht), der Absturz tritt jedoch kurz nach dem Aufruf auf.

Hat jemand eine Ahnung, was los ist?

Das liegt auf der Hand, aber nur um klar zu sein, wenn ich das nur auskommentiere[requester performSelectorOnMainThread... Teil, es stürzt nicht ab.

Hier ist auch ein Stack-Trace, der aber überhaupt nicht hilfreich ist.

#0  0x00a71004 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ ()
#1  0x93436e3b in objc_exception_throw ()
#2  0x0028aca6 in __NSThreadPerformPerform ()
#3  0x00a098e1 in CFRunLoopRunSpecific ()
#4  0x00a08c48 in CFRunLoopRunInMode ()
#5  0x0005a78d in GSEventRunModal ()
#6  0x0005a852 in GSEventRun ()
#7  0x0168a003 in UIApplicationMain ()
#8  0x000028d4 in main (argc=1, argv=0xbffff100) at /Users/myName/Document/appName/main.m:14

Antworten auf die Frage(1)

Ihre Antwort auf die Frage