Почему UITableView аварийно завершает работу приложения в dealloc? - PullRequest
1 голос
/ 13 марта 2009

Я делаю это в dealloc представления

[baseTable release];

В заголовочном файле я объявляю это так:

IBOutlet UITableView *baseTable;
....
@property(nonatomic, retain) UITableView *baseTable;

По какой-то причине я получаю "EXC_BAD _ACCESS" в dealloc. Когда я закомментирую вышеприведенную строку, все хорошо. Как я могу определить, что конкретно происходит с UITableView и выпустить?

Ответы [ 4 ]

4 голосов
/ 21 марта 2009

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

Чтобы включить NSZombie:

  1. Разверните раздел «Исполняемые файлы» в окне «Группы и файлы» слева.
  2. Открыть свойства исполняемого файла.
  3. Найдите раздел "Аргументы" (он находится в нижней половине экрана, я забыл, на какой вкладке он находится)
  4. Добавить новый аргумент "NSZombieEnabled" со значением "YES"

Чтобы отключить его, либо удалите значение, либо снимите его, если вы захотите включить его позже. Обязательно не оставляйте его включенным, потому что он фактически ничего не освобождает при включении!

1 голос
/ 13 марта 2009

Звучит так, как будто ты переиздаешь baseTable. Трудно сказать, где это может происходить, не видя больше вашего кода. Вы передаете право собственности на эту таблицу пулу авто-релизов в любой момент? Когда вы автоматически высвобождаете объект, вы передаете право собственности в пул автоматического высвобождения, и вам нужно обязательно отказаться от объекта (и, возможно, nil из его переменной экземпляра).

Вам необходимо проверить каждое использование baseTable и убедиться, что любой объект, который может стать владельцем таблицы, сохраняет его, прежде чем его освободить. Также помните, что вы можете ссылаться на объект таблицы через псевдоним в качестве параметра метода UITableViewDelegate или UITableViewDataSource.

1 голос
/ 13 марта 2009

Я предполагаю, что вы выпускаете baseTable слишком много раз где-то, ищите место, где вы выпускаете его без сохранения.

У вас должен быть один и только один релиз на каждое удержание, начните с него и посмотрите, как вы идете. Сложность заключается в том, чтобы при передаче объекта baseTable совпадение релиза / сохранения совпадало. Так что это не будет так просто, как grep на [baseTable release] и, к сожалению, считать их:)

0 голосов
/ 29 октября 2012

когда вы используете свойство Retain, поставьте галочку, если

if(self.tableView!=nil)
{
self.tableView = nil;
}

в dealloc. Таким образом, вы проверяете, является ли табличное представление нулем и является ли оно нулем, вы превращаете его в ноль.

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