ОбзорUITableView - moveRowAtIndexPath вызывает утечку памяти
- В проекте IOS, у меня есть
UITableView
, и я пытаюсь переместить строку UITableView. - В моей модели порядок данных был изменен, так что я пытаюсь визуально показать в таблице, поэтому я использовал
UITableView
«s методmoveRowAtIndexPath:toIndexPath:
- Для того, чтобы сделать так, что я создал
NSIndexPath
экземпляр, который я передаю методу UITableView.
Когда утечка accurs
- При создании экземпляра NSIndexPath с помощью метода
indexPathForRow: section:
(как показано в секции кода), а затем передать его в методеUITableView
«smoveRowAtIndexPath: toIndexPath:
его утечки.
Примечание:
- Я использую ARC (автоматический подсчет ссылок)
- XCode 4.3.1
- Я использовал инструменты (Xcode меню - Product> Профиль), чтобы определить утечка памяти
Код: (внутри 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 ((__ bridg e void *) toIndexPath);
Вопросы:
- Почему это происходит? есть ли какое-нибудь решение?
- Является ли результат утечки памяти прибора точным?
- Есть ли ошибка в методе UITableView
moveRowAtIndexPath:originalIndexPath toIndexPath:
? - Есть ли CFRelease вариант? Есть ли безопасный способ предотвратить сбой приложения в случае, если CFRelease пытается освободить уже выпущенную память (см. Точный код выше).
я не уверен, если инструменты будут указывать на утечку памяти, если объект был разыменованный, но не сбор мусора, поэтому это комментарий, а не ответ. Вы пытались запустить [[NSGarbageCollector defaultInstance] collectExhaustively] после обновлений? –
спасибо за ответ, я делаю проект iOS, поэтому я не смог бы попробовать сбор мусора. исправьте меня, если я ошибаюсь – user1046037