2015-08-25 4 views
0

У меня очень общий вид таблицы.странная ошибка при перезагрузке tableView

Когда он обновлен, он перейдет к списку объектов из Парса. Проанализируйте эти данные в очереди dispatch_async, затем обновите представление таблицы. Большую часть времени, он не имеет никаких проблем, но некоторое время reloadData аварии()

enter image description here

Это происходит сбой, поскольку Tableview является перегрузка данных, когда я называю это? (когда tableview является init, reloadData может вызываться автоматически). Как избежать этой ошибки? (Нет сообщения об ошибке в консоли)

EDIT: Я попытался поставить ?, но не работает

enter image description here

+0

Я думаю, что добавление/удаление ячеек обновляется UI –

+0

Вы освобождаете таблицу перед перегрузкой? – JAL

+0

@JAL nope, эта функция находится в UITableViewController –

ответ

0

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

Проверить эту ссылку для некоторой информации:

http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/

+0

Но это написано в UITableViewController, разве они не гарантируют, что tableView не равен нулю? И быстрый заставит var быть дополнительным, когда возможно быть nil –

+0

OK, я просто перечитываю ваш пост и вижу, что вы думаете, что это может быть потому, что он вызывает его, пока tableView перезагружается, попробуйте задержать это reloadData на секунду и посмотреть, исправляет ли это проблему (чтобы дать время tableView завершить перезагрузку перед вызовом reloadData.) Если это все еще дает ту же ошибку, я бы затем проверил, возможно ли вы освободите UITableViewController или каким-то образом создают экземпляр нового, чтобы заставить его освободиться, потому что это действительно вызвано только тогда, когда вы отправляете сообщения объектам, которые не существуют в куче. –

+0

Я попытался вызвать «reloadData()» несколько раз, либо первый сбой вызова, либо нет. Итак, мое предположение неверно. Когда я удаляю main_queue, кажется, что ошибка не возникает –

0

вы получите ошибку EXC_BAD_ACCESS в основном в следующих случаях:

Вы пытаетесь получить доступ к объекту, который не инициализирован.

Вы пытаетесь получить доступ к объекту, который больше не существует. Либо он выпущен, либо он ноль. В режиме ARC убедитесь, что вы взяли на себя ответственность за объект, который хотите использовать. Вы передаете сообщение объекту, который объект не понимает.

Это может случиться и для плохой приведения типов. Как строки ниже, где я пытаюсь получить доступ к int с% @ вместо% d.

int myAwesomeInt = 9; 
NSLog(@"%@", myAwesomeInt); 

Как отлаживать:

Определите, что вы сделали, что причиной аварии. Сбой при просмотре определенного вида контроллера didLoad или в методе делегата или в конкретном действии. Это часто поможет найти объект, который вызывает ошибку.

(В вашем случае смотреть на то, что конкретно происходит, когда вы перезагрузки таблицы. Выполните трассировки стека построчно и посмотреть, что делает ваш код во время перезагрузки)

Большую часть времени «NSZombies» может помогают идентифицировать мертвый объект. Вы можете включить NSZombies, отредактировав свою схему Product -> Edit Scheme -> Diagnostics.

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

Кредит: The Basic Troubleshooting guide

Надеется, что это помогает.Удачи

+0

Сбой происходит, когда я запускаю приложение, а tableView начинает загрузку. Итак: 1. Я считаю, что UITableViewController гарантирует, что tableView существует, 2. я не могу освободить self.tableView. 3. reloadData() должен понимать –

+0

Просто из любопытства, что происходит, когда вы заменяете self.tableview инструкцией NSLog? Это может нам что-то сказать, если NSLog по-прежнему имеет ту же ошибку. – FujiRoyale

+0

Я постараюсь завтра –