Как предотвратить быстрое нажатие кнопки «Редактировать» для UITableView несколько раз от сбоя приложения? - PullRequest
1 голос
/ 08 ноября 2010

У меня есть подкласс UITableViewController, который выполняет некоторые анимации при входе в режим редактирования, а именно: удаление UIBarButtonSystemItemAdd из панели навигации и анимация первой строки таблицы из отсутствия, а затем возврат в режим редактирования выход:

- (void) setEditing: (BOOL) editing animated: (BOOL) animated
{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow: 0 inSection: 0];

    if (editing)
    {
        [self removeAddButton];
        [datasource removeObjectAtIndex: 0];
        [tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationTop];
    }
    else
    {
        [self restoreAddButton];
        [datasource insertObject: @"First Row" atIndex: 0];
        [tableView insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationTop];
    }

    [indexPath release];
    [super setEditing: editing animated: animated];
}

Проблема в том, что когда кнопка «Редактировать» нажимается слишком быстро несколько раз, а анимация еще не завершена, приложение вылетает с:

AppName(1824,0xa0ae5500) malloc: *** error for object 0x5f503a0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Очевидно, что что-то происходит, когда у чего-то, что анимируется внутри или снаружи, не хватает времени, чтобы закончить, так как же мне обойти это? Я делаю что-то ненужное / неправильное?

1 Ответ

2 голосов
/ 08 ноября 2010

На самом деле это простая ошибка управления памятью.

Удалить эту строку:

[indexPath release];

причина? Эта строка:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow: 0 inSection: 0];

Возвращает NSIndexPath с эффективным счетом сохранения 0. Вам не нужно освобождать его.

При возникновении ошибки освобождения памяти вам следует запустить ее снова с включенным NSZombieEnabled. Это даст вам более полное сообщение об ошибке.

Вы должны также привыкнуть использовать Build & Analyze; это, вероятно, пометило бы это.

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