NSDictionary вызывает EXC_BAD_ACCESS - PullRequest
0 голосов
/ 17 июня 2010

Я пытаюсь вызвать objectForKey: на необязательном ivar, но я получаю ошибку EXC_BAD_ACCESS. Nsdictionary создается с использованием JSON-фреймворка и затем сохраняется. В первый раз, когда я его использую (сразу после создания, тот же цикл выполнения), он работает отлично, но когда я пытаюсь получить к нему доступ позже, ничего не работает. Я делаю этот код, чтобы попытаться выяснить, что не так:

if (resultsDic == nil) {
    NSLog(@"results dic is nil.");
}
if ( [resultsDic respondsToSelector:@selector(objectForKey:)] ) {
    NSLog(@"resultsDic should respond to objectForKey:");
}

Словарь никогда не равен нулю, но он всегда вылетает при отклике на ToSelector. есть идеи?

дополнение: Это и другие места, помимо вышеупомянутых, с которыми взаимодействует словарь:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [connection release];

    //get the data in a usable form
    NSString *jsonString = [[NSString alloc] initWithData:downloadedData encoding:NSUTF8StringEncoding];
    resultsDic = [jsonString JSONValue];

    [self processResults];

    NSLog(@"Success. Received %d bytes of data",[downloadedData length]);
    [downloadedData release];
    [jsonString release];
}



- (void)processResults
{
        NSArray *resultsArr = [resultsDic objectForKey:@"results"];
                CLLocationCoordinate2D coordinate = [self coordinateFromResult:[resultsArr objectAtIndex:0]];
        NSLog(@"lat: %f lng: %f", coordinate.latitude, coordinate.longitude);
}

- (void)dealloc {
  [resultsDic release];
  [super dealloc];
}

Ответы [ 2 ]

0 голосов
/ 17 июня 2010

Звучит как классический зомби.Запустите его снова с переменной среды NSZombieEnabled, установленной на YES (или используйте инструмент Zombies в Instruments.app).Это должно дать вам гораздо больше информации о том, что происходит.

0 голосов
/ 17 июня 2010

После того, как количество сохраняемых предметов уменьшится до 0, объект освобождается.Это не то же самое, что установить его на ноль.Это не будет ноль.Хотя вы можете отправлять сообщения на ноль, отправка сообщения освобожденному объекту приведет к ошибке EXC_BAD_ACCESS.Если вы разместите часть кода, где он создан и используется, возможно, мы сможем помочь вам отладить его.Попробуйте сохранить его дважды в начале.Это не элегантное решение, но оно может быстро помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...