Обзор
- В проекте iOS у меня есть
UITableView
, и я пытаюсь переместить строку UITableView. - В моей модели изменен порядок данных, поэтому я пытаюсь визуально показать это в таблице, поэтому я использовал метод
UITableView
moveRowAtIndexPath:toIndexPath:
- Для этого я создал экземпляр
NSIndexPath
, который я передаю методу UITableView.
Когда происходит утечка
- Когда вы создаете экземпляр NSIndexPath с помощью метода
indexPathForRow: section:
(как показано в разделе кода), а затем передаете его методуUITableView
moveRowAtIndexPath: toIndexPath:
, происходит утечка.
Примечание.
- Я использую ARC (автоматический подсчет ссылок)
- XCode 4.3.1
- Я использовал Инструменты (меню Xcode - Продукт > Профиль), чтобы определить утечку памяти.
Код: (внутри UITableViewController)
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0]; //leaking
[self.tableView beginUpdates];
[self.tableView moveRowAtIndexPath:originalIndexPath toIndexPath:newIndexPath]; //I think this causes the leak
[self.tableView endUpdates];
Шаги, которые я пробовал
- Комментирование вызова метода
moveRowAtIndexPath:originalIndexPath toIndexPath:
предотвращает утечку памяти Я вручную использовал
CFRelease
(не уверен, что это хорошая практика в среде автоматического подсчета ссылок)CFRelease((__bridge void *)toIndexPath);
Вопросы:
- Почему это происходит? есть ли какое-нибудь решение?
- Являются ли результаты утечки памяти прибора точными?
- Есть ли ошибка в методе UITableView
moveRowAtIndexPath:originalIndexPath toIndexPath:
? - Можно ли использовать CFRRelease? Есть ли безопасный способ предотвратить сбой приложения в случае, если CFRelease попытается освободить память, которая уже была освобождена (см. точный код выше).