Cocoa-Touch: performSelectorOnMainThread: dziwne zachowanie + awaria

Mam sytuację, w której leniwie ładuję obrazy z www.
Jest to lista przedmiotów, gdy jeden przedmiot jest puknięty, widok szczegółów jest pchany do kontrolera nawigacji.

W tym widoku szczegółowym element ma obraz, który najpierw jest obrazem domyślnym i chcę rozpocząć ładowanie jego obrazu z adresu URL.

Tak więc tworzę obiekt, który po zainicjowaniu odłącza nowy wątek, który z kolei ładuje zawartość, a następnie powiadamia mój widok, że dane są ładowane:

// 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.
}

Kilka uwag:

Najpierw pomyślałem, że może być problem z niektórymi zmiennymi. Przedtem umieściłem punkt przerwaniaperformSelectorOnMainThread i potwierdził todata irequester oba były OK.

Wtedy pomyślałem, że to spowodowane przekazaniem NSData przez wątki, więc się zmieniłemwithObject:nil. Nadal się zawiesza.

Kiedy dalej badałem, katastrofa była bardzo dziwna. OkreśliłemwaitUntilDone:YES, Umieściłem punkt przerwania wrequesterjestdataReady. AleperformSelectorOnMainThread wywołanie zwraca (osiąga punkt przerwania po nim), nie osiągając punktu przerwania wewnątrzdataReady. BTW,- (void)dataReady:(NSData*)ciało na razie zawiera tylkoint x = 1; (aby umieścić punkt przerwania). Próbowałem również ustawićwaitUntilDone:NO, nadal się zawiesza.

Selektor nie jest wykonywany (punkt przerwania nie został osiągnięty), ale awaria występuje krótko po wywołaniu.

Czy ktoś ma pojęcie, co się stało?

Jest to oczywiste, ale żeby było jasne, jeśli tylko skomentuję[requester performSelectorOnMainThread... część, nie ulega awarii.

Również tutaj jest ślad stosu, ale w ogóle nie jest pomocny.

#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

questionAnswers(1)

yourAnswerToTheQuestion