2010-03-29 2 views
0

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

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

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

Фрид (ID): сообщение numberOfSectionsInTableView: отправлен на освобожденный объект

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

ответ

0

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

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

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

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

+0

Привет, спасибо за помощь. Ваши ответы имеют для меня большой смысл, но я все еще не могу заставить его работать. Я реструктурировал проект, чтобы попытаться решить мою проблему, в настоящее время вкладка загружает аудио.xib с помощью audioViewController и ту же структуру для видео. в audioViewController.h добавить UITableView как IBOutlet, например @interface audioViewController: UIViewController { \t IBOutlet UITableView * audioTable; } – padatronic

+0

Затем я в IB добавляю класс auidoTableViewController к audio.xib и удаляю из него таблицу. Добавьте таблицу в представление в IB и привяжите ее к звуковому типу, созданному в audioViewController.h. Я связываю источник данных и делегат с аудиоконтроллером AudioTableView в IB. Затем я добавляю в audioViewController.m. - (void) viewDidUnload { \t // Освобождение любых сохраненных подзонов основного вида. \t // например. self.myOutlet = nil; \t [audioTable removeFromSuperview]; } - (void) dealloc { \t [audioTable release]; \t [super dealloc]; } . – padatronic

+0

Я делаю то же самое для видео, и когда я пытаюсь изменить вкладки, он сворачивает, но теперь в консоли не регистрируется ошибка. Является ли это правильным способом структурирования моего приложения, и я пытаюсь выпустить представление AudioTable в неположенном месте? надеюсь, что это ясно, имея настоящий фокус с этим. Не знаете, как определить, что не так. – padatronic

1

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

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

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

+0

Блестящий да согласованный alex. Таким образом, у меня есть звук класса uview, в котором внутри него находится табличный вид, контролируемый классом audioTableViewController класса UITableView. Та же настройка для видео. Поэтому я предполагаю, что мне нужно освободить представление таблицы. Я ссылаюсь на это, я делаю это в методе dealloc для audioTableViewController? спасибо – padatronic

+0

Если это не подкласс 'UITableViewController', то да, вам нужно освободить представление таблицы.Если вы выделили его (даже загрузив NIB), вы несете ответственность за его освобождение. – Alex

Смежные вопросы