сбой при просмотре таблицы target-c при перезагрузке - PullRequest
0 голосов
/ 07 декабря 2011

Я создал массив объектов в главном делегате приложения, который загружает данные из базы данных sqlite. Когда я загружаю TableView, свойство в этом классе устанавливается для указания на массив объектов. Затем, когда отображается TableView, он правильно возвращает счетчик массива для количества строк и отображает текст в ячейке из свойства соответствующего объекта в массиве.

У меня также есть кнопка обновления в верхнем правом углу панели навигации, которая выходит и загружает файл XML из сети, анализирует его, а затем обновляет базу данных.

Затем я воссоздаю основной массив объектов из базы данных и указываю свое свойство TableView на новый массив, а затем прошу TableView перезагрузить данные. Вот где он затем падает с EXC_BAD_ACCESS.

Я прошел с отладчиком и определил, что все правильно до вызова reloadData. База данных и основной массив синхронизированы, и пользовательское свойство TableView также указывает на основной массив.

Затем, когда я перешёл к отладчику, я заметил пару вещей. Во-первых, когда он вызывает numberOfRowsInSection, указатель на основной массив является правильным, а количество строк - правильным. Во-вторых, когда он достигает первого вызова cellForRowAtIndexPath, указатель на основной массив указывает на недопустимый раздел памяти. Фактический адрес памяти тот же, но массив объектов исчез.

Я не могу понять, как массив исчезает в середине перезагрузки, как это, потому что мой счетчик ссылок должен быть больше нуля, поэтому сборка мусора не должна производиться. Поэтому мой вопрос: кто-нибудь имеет представление о том, что может происходить? И во-вторых, как определить точное местоположение проблемы?

1 Ответ

2 голосов
/ 07 декабря 2011

Вы почти наверняка недооцениваете массив.Когда вы говорите «мой счетчик ссылок должен быть больше нуля», это почти наверняка так.Если бы это было так, оно не было бы выпущено.

Начните с поиска места, к которому у вас есть прямой доступ к ivars.Это # 1 причина ошибок управления памятью.Доступ к ivars только через аксессоры (self.thing), за исключением dealloc и init.Это решит 90% подобных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...