在iOS5中,返回NSString的方法有时会返回垃圾



我有一个应用程序在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

最新更新