NSURLConnection Crashing - PullRequest
       15

NSURLConnection Crashing

0 голосов
/ 18 сентября 2009

Я выполняю внутреннюю загрузку данных с сервера, создавая NSOperation и синхронно открывая NSURLConnections.

Этот код прекрасно работал как на симуляторе, так и на устройстве, пока я не добавил индикатор выполнения с уведомлениями, возвращающимися в основной поток.

- (void)start {
     // stop execution if it's cancelled

     if([self isCancelled]) {
          [self willChangeValueForKey:@"isFinished"];
          finished = YES;
          [self didChangeValueForKey:@"isFinished"];
          return;
     } 

     // If the operation is not canceled, begin executing the task.
     [self willChangeValueForKey:@"isExecuting"];
     [NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];
     executing = YES;
     [self didChangeValueForKey:@"isExecuting"];
}

Теперь у меня происходит сбой EXC_BAD_ACCESS при синхронном вызове.

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/index.php", rootURL]];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];

NSError *error = nil;
NSURLResponse *response = nil;
receivedData = [[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error] mutableCopy];

Трассировка стека работает следующим образом:

#0  0x3430debc in objc_msgSend ()
#1  0x3136f996 in NSPopAutoreleasePool ()
#2  0x31374160 in -[NSAutoreleasePool release] ()
#3  0x331a0408 in _UIApplicationHandleEvent ()
#4  0x325339c4 in PurpleEventCallback ()
#5  0x3147a52a in CFRunLoopRunSpecific ()
#6  0x31479c1e in CFRunLoopRunInMode ()
#7  0x3314ec08 in -[UIApplication _run] ()
#8  0x3314d230 in UIApplicationMain ()
#9  0x00002ab0 in main (argc=1, argv=0x2ffff504)

С NSZombieEnabled я получаю

*** -[NSDateComponents release]: message sent to deallocated instance 0x172fd0

Я знаю, что соединение устанавливается (посмотрел логи сервера, и запрос проходит). Ни один объект NSDateComponent не был размещен где-либо в коде NSOperation до NSURLConnection.

Я пытался понять, что я вдруг сделал неправильно с NSURLConnection, чтобы заставить меня так ненавидеть.

Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Хотя я не знаю точно, в чем ваша проблема, я знаю, что я использовал для получения случайных ошибок и сбоев при использовании NSURLConnection тоже. Тогда я нашел ASIHTTPRequest и никогда не оглядывался назад. Это капля замены NSURLConnection и запускается из CFNetwork. Он очень стабилен (я использую его во всех своих проектах) и поставляется с кучей полезных функций, таких как встроенная поддержка индикатора выполнения и частичное возобновление загрузки. Он даже может записывать напрямую на диск, чтобы сэкономить на оперативной памяти, что важно в iPhone.

0 голосов
/ 19 сентября 2009

Я также разместил этот вопрос на форумах разработчиков и получил предложение удалить параллелизм. Я удалил оскорбительную строку:

[NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];

Я также перестал переопределять запуск, и только переопределил основной.

NSURLConnection перестал сбой.

...