Случайный BAD_ACCESS и «нераспознанный селектор» - PullRequest
0 голосов
/ 28 января 2011

Эй, я новичок в Objective C, и мои годы .NET и Java испортили мои навыки управления памятью, так что очень вероятно, что я что-то здесь упустил.

Я создаю приложение для iPad. Основным представлением является SplitView с табличным представлением слева, а подробное представление содержит еще одно табличное представление. Загрузка последнего с данными была закомментирована в попытке выделить мою проблему.

Приложение работает нормально (приходится извлекать данные из .NET WS и анализировать их в таблице), но в случайное время я получаю сообщения об ошибках BAD_ACCESS или "селектор не распознан".

Селектор не распознал ошибку, которую я получаю здесь:

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

Этот фрагмент кода, о котором я уверен, что большинство из вас знают, я получил его из всех примеров, найденных в Интернете и в книгах, для отправки веб-запроса.

Бьет меня, почему он говорит, что не распознает селектор setLength, webData определяется как

NSMutableData *webData;

Есть идеи?

Спасибо.

Ответы [ 4 ]

1 голос
/ 28 января 2011

Если вы не выделите объект webData ни с помощью

NSMutableData* webData = [[NSMutableData alloc] initWithCapacity:2048];

, ни с

NSMutableData* webData = [[NSMutableData data] retain];

, то объект webData, скорее всего, будет автоматически освобожден во время одного из переключений контекста из NSURLConnectionсообщение о том, что вы выделили его (вероятно, connection:didReceiveData:) для сообщения connection:didReceiveResponse:.

Любой объект, который вы не alloc или явно retain, вероятно, будет освобожден во время изменений области действия, даже еслиэто переменная-член вашего класса.

1 голос
/ 28 января 2011

Скорее всего, вы неправильно создаете NSMutableData.Я ожидаю, что у вас есть код, который выглядит как

webData = [NSMutableData data];

Это даст вам автоматически выпущенный объект, и все же вы храните его в ivar.Вам нужно взять на себя ответственность за объект при хранении его в иваре.В вашем случае самый простой способ - просто пропустить удобный метод и использовать alloc / init:

webData = [[NSMutableData alloc] init];

Для получения более подробной информации прочитайте Руководство по программированию управления памятью .

1 голос
/ 28 января 2011

Кажется, это очень обычная (не только для начинающих) ошибка, когда соединение не отменяется в dealloc или viewWillDisappear. Когда вы покидаете контроллер, вы должны отменить все соединения, таймеры и т. Д., Созданные контроллером, чтобы они не могли вызывать методы делегатов или селекторы для освобожденных объектов контроллера.

0 голосов
/ 28 января 2011

Похоже, что webData освобождается и заменяется другим объектом. Не забудьте сохранить его, если вы не используете alloc / init или mutableCopy для его получения.

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