ошибка super dealloc при использовании нескольких классов табличного представления - PullRequest
0 голосов
/ 29 марта 2010

Я новичок в приложениях для Iphone и пытаюсь создать приложение на основе вкладок. Я пытаюсь разместить таблицу поверх изображения на обеих вкладках. На вкладке с таблицей аудио ссылок и другой вкладкой с таблицей видео ссылок.

Все прошло гладко, я создал два viewController для двух таблиц. Весь код прекрасно работает, кроме как для того, чтобы заставить его работать. Я должен закомментировать супер dealloc в - (void) dealloc {} в videoTableViewController для второй закладки.

Если я не получаю, я получаю сообщение об ошибке:

FREED (id): сообщение numberOfSectionsInTableView: отправлено освобожденному объекту

пожалуйста, помогите, я понятия не имею, почему он это делает ...

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Если вы не звоните [super dealloc], значит, ваш объект не освобождается и вы теряете память. Вам необходимо раскомментировать этот звонок на [super dealloc].

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

Если ваш контроллер представления не подкласс UITableViewController, то вам потребуется release ссылка на табличное представление, которое вы держите. Если это подкласс UITableViewController, то должно быть какое-то другое место, где это табличное представление retain ed, где оно не должно быть.

0 голосов
/ 29 марта 2010

UITableViewController управляет управлением памятью для своего собственного tableView объекта, поэтому теоретически вам не нужно об этом беспокоиться.

Как сказал Алекс, определенно плохо не звонить [super dealloc]; это утечка памяти, чтобы оставить это без внимания.

Чтобы решить эту проблему, вам нужно выяснить, почему ваше табличное представление живет дольше, чем ваш контроллер представления (это то, что дает вам эту ошибку FREED (id)). Можно предположить, что вы покидаете представление в иерархии представлений, но освобождаете контроллер. Желаемое поведение при переходе от одного контроллера представления к другому - удалить старое представление из иерархии представления, вызвав [oldView removeFromSuperview] и , а затем , освободив контроллер представления, если вы хотите освободить его при все. Причина, по которой removeFromSuperview важна, состоит в том, что суперпредставления всегда сохраняют свои подпредставления, поэтому может быть поэтому ваш tableView так нежить.

Если ваше приложение не потребляет много памяти, может быть проще всего просто выделить ваши контроллеры представлений (не освобождать их) - это решит вашу проблему, хотя на самом деле это не решает проблему того, что ваше табличное представление дольше чем ожидалось, что может быть признаком неэффективного кода, который было бы неплохо очистить.

...