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

NSNumber storing objects of NSDictionary in Objective-C

我的 iOS 应用因 Thread 1: signal SIGABRT 错误而终止。奇怪的是,当我将光标悬停在 NSNumber 对象(发生错误的地方)上时,它会显示带有 Key/Value 对的 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 个 key/value 对(每个键包含 5 个对象的 NSArray)。nextDict 是一个 NSDictionary,有 4 个 key/value 对(每个键包含一个 NSNumber 对象 // 编辑:每个键实际上包含一个 NSArray 与单个NSNumber 对象,这是错误的原因)。在应用程序终止并将光标悬停在 HereIsTheError 上后,我得到以下 key/value 对:

控制台的终止错误是:

*** 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.

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

-[__NSArrayM floatValue]: unrecognized selector...

你的部分错误。

确保 AnArrayInsideMainDict 中的对象实际上是 NSNumber 在尝试将它们转换为数字之前,


我建议在 "assuming" 它们的类型之前标记你的对象,但我怀疑这会帮助你获得你想要的结果(因为这很可能从你的情况来看跳过每个对象 不是 NSNumber).

甚至在 [MainDict allKeys] 中进入 for 循环之前,backtrace 以确保您实际上将 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); 

...

LASTLY,如果你胆子大,并且确定这本词典中的某处是你的NSNumber,你可以标记你的步骤来检查实例的 NSNumber.class 来寻找你的花车。

否则,我建议深入研究 如何从哪里 获取 MainDict

编码愉快 - 干杯!