应用程序在模拟器中工作,但不在设备上工作 - NSMutableArray

时间:2010-12-20 11:51:34

标签: iphone objective-c ios-simulator nsmutablearray

我的应用程序有问题,在模拟器上运行良好但是当我在iDevice上启动时出现错误:

     Terminating app due to uncaught exception 'NSInvalidArgumentException',
         reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 0'


    0   CoreFoundation                      0x3513cfd3 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x303928a5 objc_exception_throw + 24
    2   CoreFoundation                      0x350bff99 -[__NSArrayM insertObject:atIndex:] + 472
    3   CoreFoundation                      0x350bfda7 -[__NSArrayM addObject:] + 34
    ....
    Program received signal:  “SIGABRT”.

在调试器中,我可以看到问题出在哪里。错误来自于addObject:

for (int i = 0; i < [arrayValues count]; i++) {
    f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    myNumber =[f numberFromString:[arrayValues objectAtIndex:i]];

    [arrayValues2 addObject:myNumber]; 
    [f release];    }

这里我在arrayValues2中的NSNumbers中转换arrayValues(NSString)的对象。

在模拟器中没有问题,阵列不是空的。 我不知道在哪里寻找。

我还检查了stackoverflow的其他帖子,它们并不像我的错误

2 个答案:

答案 0 :(得分:2)

好吧......我不确定你的问题是什么,但有更好的方法来做到这一点...

for(NSString *theString in arrayValues){
    NSNumber *aNumber = [NSNumber numberWithFloat:[theString floatValue]];
    [arrayValues2 addObject:aNumber];
}

这可能有所帮助,因为你不会超越任何数组边界,也不会插入任何nil对象。

如果您需要更多帮助,您将需要NSLog arrayValues并提供输出,以便我们可以看到您正在处理的内容。 :)

答案 1 :(得分:1)

只是处理你提供的信息,就不可能查明问题(数据来自哪里?),但我们可以说这个例外提供了一个很大的线索:

您无法将nil值插入数组(如果确实需要,请使用NSNull)。

为什么有nil值?好吧,当你尝试将你的字符串转换为数字时,它会发现它无法识别的东西。当发生这种情况时,它会返回nil

因此,您需要清理数据(以确保所有 一个数字)或在循环中放置错误处理,以便它不会尝试将无效值放入数组中。

(另外,I agree with Thomas关于你的实现。他的版本将更容易调试并使用更少的内存。)