objc_msgsend при установке cell.imageView.image - PullRequest
0 голосов
/ 08 марта 2010

этот код работает нормально, пока я не начну прокручивать:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

Route *r = [data routeForDay:day index:indexPath.row];
cell.textLabel.text = r.name;
cell.imageView.image = r.image;

return cell;
}

Он отлично работает для каждой строки, пока я не прокручиваю вниз, когда происходит сбой с objc_msgsend на cell.imageView.image = r.image; Я подтвердил, что ничто не ноль, я даже проверил retainCount для всего, что связано. Я в полном недоумении, есть идеи? Спасибо.

Edit:

Я решил проблему, но не понимаю, как из-за изменений в коде ошибка исчезла, поэтому я буду признателен за подсказку, если кто-нибудь знает.

Так было изначально создано изображение в методе инициализации Route. изображение стало освобождаться при прокрутке таблицы в моем контроллере просмотра таблиц.

NSString *imagePath = [[NSBundle mainBundle] pathForResource:[dict valueForKey:@"image"] ofType:@"png"];
image = [UIImage imageWithContentsOfFile:imagePath];

Когда я изменил вторую строку на

image = [[UIImage alloc] initWithContentsOfFile:imagePath];

все работало нормально.

Я просто немного смущен и несчастен.

1 Ответ

3 голосов
/ 08 марта 2010

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

Я предполагаю, что один из объектов, на которые указывают data, r или r.image, не сохранен должным образом.

Еще одна вещь: не смотрите retainCount, прежде чем углубленно разбираться в управлении памятью (и особенно пулах автоматического выпуска). В противном случае вас будет смущать только возвращаемое значение.

Как включить зомби:

Выберите «Проект»> «Редактировать активный исполняемый файл», чтобы открыть окно информации о исполняемом файле.
Нажмите Аргументы.
Нажмите кнопку добавления (+) в разделе «Переменные, которые должны быть установлены в среде».
Введите NSZombieEnabled в столбце Имя и ДА в столбце Значение.
Убедитесь, что установлен флажок для записи NSZombieEnabled.

Изменить:

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

Вкратце: imageWithContentsOfFile: возвращает автоматически освобожденный объект, а initWithContentsOfFile: возвращает сохраненный объект. Но опять же: прочитайте документы, иначе у вас останутся ошибки памяти.

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