Cocoa-Touch: executeSelectorOnMainThread: странное поведение + сбой

У меня ситуация, когда я лениво загружаю изображения с www.
Это список элементов, когда один элемент касается, подробный вид передается на контроллер навигации.

В этом подробном представлении элемент имеет изображение, которое сначала является изображением по умолчанию, и я хочу начать загрузку его изображения с URL-адреса.

Поэтому я создаю объект, который после инициализации отсоединяет новый поток, который, в свою очередь, загружает содержимое, а затем уведомляет мое мнение о том, что данные загружены:

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

Несколько заметок:

Сначала я подумал, что может быть проблема с некоторыми переменными. Я ставлю точку останова прямо передperformSelectorOnMainThread и подтвердил, чтоdata а такжеrequester оба были в порядке.

Затем я подумал, что это вызвано передачей NSData между потоками, поэтому я изменилwithObject:nil, Это все еще падает.

Когда я продолжил расследование, крушение было очень странным. Я уточнилwaitUntilDone:YESЯ установил точку останова вrequester«sdataReady, НоperformSelectorOnMainThread вызов возвращает (он достигает точки останова после него), не достигая точки останова внутриdataReady, КСТАТИ,- (void)dataReady:(NSData*)Тело пока содержит толькоint x = 1; (чтобы установить точку останова). Кроме того, я попытался установитьwaitUntilDone:NOвсе еще падает.

Селектор не выполняется (точка останова не достигнута), но сбой происходит вскоре после вызова.

У кого-нибудь есть идеи, что не так?

Это очевидно, но для ясности, если я просто закомментирую[requester performSelectorOnMainThread... часть, это не терпит крах.

Кроме того, здесь есть трассировка стека, но она не помогает вообще.

#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

Ответы на вопрос(1)

Ваш ответ на вопрос