У меня есть приложение, которое отлично работает в iOS 4, но происходит сбой при прокрутке UITableView, когда тот же точный код компилируется с использованием iOS5 и XCode 4.2. Код нарушения приведен ниже:
- (NSString *)getDefaultIconName {
NSInteger value = [self.iconId characterAtIndex:0] % 4;
NSString *returnValue = nil;
switch (value) {
case 0:
returnValue = @"default_icon_1";
break;
case 1:
returnValue = @"default_icon_2";
break;
case 2:
returnValue = @"default_icon_3";
break;
case 3:
default:
returnValue = @"default_icon_4";
break;
}
return returnValue;
}
Этот метод вызывается из подкласса UITableViewCell, который создается или повторно используется при вызове cellForRowAtIndexPath. Когда таблица создана и отображаются ячейки, этот вызов возвращает правильную строку. Когда я прокручиваю таблицу вниз, этот вызов возвращает недопустимую ссылку, что приводит к сбою моей попытки сохранить строку в другом классе с EXEC_BAD_ACCESS. В отладчике я вижу, что UITableViewCell существует правильно, и все значения установлены правильно, за исключением возвращаемого значения для этого вызова, которое говорит Invalid CFStringRef.
Как ни странно, если я размещаю оператор NSLog, распечатывающий returnValue перед возвратом, он не падает. То же самое верно, если я проверяю, является ли returnValue isKindOfClass:[NSString class] перед его возвратом.
Третье, что я заметил, это то, что если я компилирую с отключенной оптимизацией кода, он также не падает.
Я хочу убедиться, что я правильно исправил это в приложении, чтобы проблема не возникала снова в будущем.
edit: Извините, returnValue, в котором отсутствует *, был опечаткой.
get; это должно быть простоdefaultIconName. - person bbum   schedule 07.11.2011