我的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
之后,我得到以下键/值对:
控制台上的终止错误是:
*** 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。
答案 0 :(得分:1)
正如评论所述,但最重要的是错误消息指出,您的对象anObject
和nextObject
不 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
。
快乐的编码 - 干杯!