2013-12-09 5 views
-1

Я разрабатываю приложение IOS. setLength метод сбой в didReceiveResponse. Как вы думаете, в чем причина этого. Что мне следует предотвратить.NSData setLength EXC_BAD_ACCESS

enter image description here

- (void) callService:(NSString*)urlString 
{ 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL urlString]]; 

    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setHTTPBody:[urlString dataUsingEncoding:NSUTF8StringEncoding]]; 

    theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if(theConnection) { 
     self.webData = [[NSMutableData data] retain]; 
    } 
    else { 
     NSLog(@"connection is NULL"); 
    } 

} 

#pragma mark Web service 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [self.webData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.webData appendData:data]; 
} 
+0

проверьте свою консоль ... вы получаете сообщение «connection is NULL» –

+0

Сообщение об исключении указывает, что setLenght: вызывается в * массиве *. Установите точку останова в didReceiveResponse и проверьте объект self.webData. –

+0

Вы пытались запустить приложение с включенным «Zombies», чтобы найти возможные проблемы с управлением памятью? –

ответ

0

Обычно аварии на NSData использований, на самом деле ранняя проблема высвобождения. NSData, инициализированный [NS(Mutable)Data data], является авторезистируемым объектом, даже если вы на нем набрали retain.

Чтобы убедиться, что этот объект не освобождается до того, как вызывается didReceiveResponse, инициализируйте его [[NSMutableData alloc] init]. Это должно сделать это

+1

Это не совсем правильно. Сохранение объекта увеличивает количество ссылок, поэтому оно не будет удалено, даже если текущий пул авторезистов заканчивается. –

+1

Поскольку это продолжает расти, я чувствую себя обязанным поддержать Мартина: этот ответ путается («autoreleasable» - это не вещь) и дает бессмысленные советы ('[[NSMutableData alloc] init]' не отличается от '[[NSMutableData data] сохранить] 'с точки зрения собственности. –

-1

Попробуйте это, может быть поможет вам:

это может быть сбой из-за данных ответа NULL поэтому проверить данные ответа и установите следующее условие для будущей цели:

И синтезируйте ваши NSData:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    if(responseData != NULL) 
    { 
     [responseData setLength:0]; 
    } 
} 
+1

' [responseData setLength: 0]; 'does * not * crash, если responseData равен нулю. –

0

Похоже, вы ошиблись в управлении памятью.

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

@property (retain) NSMutableData *webData; 

Если вы синтезировал аксессор они должны делать выпуск сохранить/для вас.

Чтобы ответить, почему ошибка возникает, нам нужно больше кода.

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