NSNumber在Objective-C中存储NSDictionary的对象

时间:2018-05-03 09:53:43

标签: ios objective-c xcode nsdictionary nsnumber

我的iOS应用终止时出现Thread 1: signal SIGABRT错误。奇怪的是,当我将光标悬停在NSNumber对象(发生错误的位置)上时,它会显示带有键/值对的NSDictionary的对象。以下是我的代码段:

for(id obj in [MainDict allKeys])
{
    NSArray *AnArrayInsideMainDict = [MainDict objectForKey:obj];
    double i=1;
    for(NSUInteger n=0; n<4; n++)
    {
        NSNumber *anObject = [AnArrayInsideMainDict objectAtIndex:n];
        NSNumber *nextObject = [nextDict objectForKey:[NSNumber numberWithDouble:i]];
        NSNumber *HereIsTheError = [NSNumber numberWithFloat:(powf(([anObject floatValue]-[nextObject floatValue]),2))];
        [ThisIsMutableArray addObject:HereIsTheError];
        i++
    }
}

此处,MainDict包含64个键/值对(每个键包含5个对象的NSArray)。nextDict是一个具有4个键/值对的NSDictionary( 每个键包含一个NSNumber对象 // 编辑:每个键实际上包含一个带有单个NSNumber对象的NSArray,这就是出错的原因 )。在应用程序终止并将光标悬停在HereIsTheError之后,我得到以下键/值对:

enter image description here

控制台上的终止错误是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM floatValue]: unrecognized selector sent to instance 0x170257a30'
*** First throw call stack:
(0x18b032fe0 0x189a94538 0x18b039ef4 0x18b036f54 0x18af32d4c 0x1000891a0 0x10008bd74 0x10020d598 0x100579a50 0x100579a10 0x10057eb78 0x18afe10c8 0x18afdece4 0x18af0eda4 0x18c979074 0x1911c9c9c 0x1000906b4 0x189f1d59c)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

NSNumber如何对NSDictionary的对象进行包容?我使用Xcode版本9.0.1(9A1004)和Objective-C。

1 个答案:

答案 0 :(得分:1)

正如评论所述,但最重要的是错误消息指出,您的对象anObjectnextObject NSNumber是 - 它们是NSMutableArray,因此

  

-[__NSArrayM floatValue]: unrecognized selector...

您的错误的一部分。

确保AnArrayInsideMainDict 中的对象实际上是 NSNumber之前尝试将它们作为数字投射,

我建议在“假设”他们的类型之前标记你的对象,但我怀疑这会帮助你得到你想要的结果(因为这很可能来自你的情况,跳过每个的对象NSNumber)。

在您在[MainDict allKeys]中输入for循环之前,回溯以确保您实际上将NSNumber的数组作为词典对象传递。

IF 你实际上不确定对象类型,你可以只是抛出一个标志,以确保你没有误解任何对象:

...

for (NSUInteger n=0; n<4; n++) {

    NSNumber *anObject = [AnArrayInsideMainDict objectAtIndex:n];
    NSNumber *nextObject = [nextDict objectForKey:[NSNumber numberWithDouble:i]];

    if ([anObject isKindOfClass:NSNumber.class] && [nextObject isKindOfClass:NSNumber.class]) {

        // Good to continue now that you know the objects

    } else NSLog(@"whoops.. anObject: %@    nextObject: %@", anObject.class, nextObject.class); 

...

最后,如果你这么大胆,并且确定这本字典中的某个地方是你的NSNumber,你可以标记你的步骤来检查{{1}的实例为了寻找你的花车。

否则,我建议您深入了解如何 来自NSNumber.class

快乐的编码 - 干杯!