我有一个应用程序在iOS 4中运行良好,但当使用iOS5和XCode 4.2编译相同的代码时,滚动UITableView时会崩溃。违规代码如下:
- (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之外,所有值都设置正确。
奇怪的是,如果我在返回之前放置一个打印returnValue的NSLog语句,它不会崩溃。如果我在返回returnValue之前检查它是否为KindofClass:[NString-class],也是如此。
我注意到的第三件事是,如果我在关闭代码优化的情况下编译,它也不会崩溃。
我想确保我在应用程序中正确修复了这个问题,这样问题就不会在将来再次发生。
edit:对不起,returnValue缺少一个*是一个拼写错误。
在声明returnValue
时将其添加到*
。现在它不是指针。
粘贴后的代码没有明显的问题,所以请在其他地方查找问题(内存损坏、过度释放的对象(。
此外,您可以索引到一个返回值数组中,而不是switch((语句:
NSInteger value = [self.iconId characterAtIndex:0] % 4;
NSString *icons[4] = {@"default_icon_1",
@"default_icon_2",
@"default_icon_3",
@"default_icon_4"};
return icons[value];
这可能是因为在情况3中,当returnValue为零时,您返回的是returnValue?如果是,请将returnValue设置为默认值。
还要确保你没有被零整除。
switch case
不适用于Objective-C对象。请改用if-else
。