2012-05-13 3 views
1

Я выполнил инструкцию от Using NSURLConnection, а иногда (очень редко) мой проект разбивается по методу.Сбой NSURLConnection при выпуске NSMutableData

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [connection release]; 
    [myNSMutableData release]; 
} 

Он падает, когда я пытаюсь освободить мою NSMutableData. Я хочу знать, почему он падает!

Некоторый код я использую:

- (void) start 
{ 
    while (1) 
    { 
     NSString *stringURL = @"http://www.iwheelbuy.com/get.php?sex=1"; 
     NSURL *url = [NSURL URLWithString:stringURL]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0]; 
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     if (connection) 
     { 
      getData = [[NSMutableData data] retain]; 
      break; 
     } 
     else 
     { 
      NSLog(@"no start connection"); 
     } 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound) 
    { 
     [getData setLength:0]; 
    } 
} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound) 
    { 
     [connection release]; 
     [getData release]; 
    } 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if ([connection.originalRequest.URL.absoluteString rangeOfString:@"get.php"].location != NSNotFound) 
    { 
     [connection release]; 
     NSString *html = [[NSString alloc] initWithData:getData encoding:NSASCIIStringEncoding]; 
     [getData release]; 
     if ([html rangeOfString:@"id1="].location != NSNotFound && [html rangeOfString:@"id2="].location != NSNotFound) 
     { 
      NSLog(@"everything is OKAY"); 
      [html release]; 
     } 
     else 
     { 
      [html release]; 
      [self start]; 
     } 
    } 
} 
+1

Показать выходы консоли и отчеты о сбоях или трассировку стека от сбоя. Также запустите приложение под инструментом Zombies. –

+0

Я продолжаю пытаться получить отчет о сбоях, но все еще не добившись успеха. Я не знаю, что такое инструмент Zombies ... – iWheelBuy

+0

Мое приложение работает под зомби, что мне делать дальше? – iWheelBuy

ответ

1

Ваш код выполняет асинхронные вызовы. Каждый раз, когда вы вызываете свой метод start, вы создаете новый экземпляр объекта NSURLConnection, но у вас есть только один объект (getData) для данных. Принимая во внимание некоторые из двух способов одновременного вызова, и когда первый из них был неудачным, он освободил ваше соединение и объект getData, а когда второй не удалось, он успешно удалит объект соединения, но ваш объект getData уже выпущен в предыдущем вызове сбой, в результате чего ваш код сбой.

Чтобы исправить это, всегда устанавливайте свои объекты в нуль после их выпуска и выполняйте проверку нуля в случае необходимости.

0

Вы должны освободить getData вместо myNSMutableData.

+0

Это был пример – iWheelBuy

+0

Хорошо. случается ли это иногда? – rishi

+0

только иногда! один раз из 100 методов «start» вызывает – iWheelBuy

 Смежные вопросы

  • Нет связанных вопросов^_^