Ошибка EXC_BAD_ACCESS при удалении объекта из NSMutableDictionary - PullRequest
0 голосов
/ 01 июля 2011

У меня есть NSMutableDictionary в качестве источника данных для моего UITableView. Я пытаюсь реализовать режим удаления и возникла проблема.

Я регистрирую ключ, который пытаюсь удалить, а также объект, которому он соответствует, так как эта проблема может быть связана с моей попыткой доступа к нераспределенной памяти или чем-то еще. Вот моя реализация tableView: commitEditionStyle: forRowAtIndexPath:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source.
        NSArray * keys = [userList allKeys];
        NSNumber *keyToRemove = [keys objectAtIndex:indexPath.row];
        NSLog(@"Key to remove: %@",keyToRemove);
        NSLog(@"Object at key: %@",[userList objectForKey:keyToRemove]);
           [userList removeObjectForKey:keyToRemove];   
              [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [keys release];
        [keyToRemove release];

    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
}

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

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

У вас нет keys или keysToRemove, поэтому вы не должны выпускать их.Я настоятельно рекомендую ознакомиться с правилами управления памятью какао .

1 голос
/ 01 июля 2011

Вот ваша проблема:

[keys release];
[keyToRemove release];

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

Как правило, вы должны освобождать объект, только если вы вызвали alloc, оставьте (не init, извините) или скопируйте его, я рекомендую вам прочитать о подсчете ссылок здесь: Practical Управление памятью

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