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.
如评论所述,但最重要的是您的 错误消息 指出,您的对象 anObject
和 nextObject
不是 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
。
编码愉快 - 干杯!
我的 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.
如评论所述,但最重要的是您的 错误消息 指出,您的对象 anObject
和 nextObject
不是 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
。
编码愉快 - 干杯!