NSNumber хранит объекты NSDictionary в Objective-C - PullRequest
0 голосов
/ 03 мая 2018

Мое приложение 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 пары ключ / значение (каждый ключ содержит NSArray из 5 объектов). nextDict - это NSDictionary с 4 парами ключ / значение (, каждый ключ содержит один NSNumber объект // РЕДАКТИРОВАТЬ: каждый ключ фактически содержал NSArray с единственным NSNumber Object, это было причиной ошибки ). После завершения приложения и наведения курсора на 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 Version 9.0.1 (9A1004) и Objective-C.

1 Ответ

0 голосов
/ 04 мая 2018

Как указано в комментариях, но самое главное в вашем сообщении об ошибке говорится, что ваши объекты anObject и nextObject не NSNumber - они NSMutableArray х, отсюда

-[__NSArrayM floatValue]: unrecognized selector...

часть вашей ошибки.

Убедитесь, что объекты в AnArrayInsideMainDict действительно NSNumber перед попыткой разыграть их как числа,


Я бы предложил пометить ваши объекты, прежде чем "предполагать" их типы, но я сомневаюсь, что это поможет вам получить желаемый результат (поскольку это, скорее всего, в данном случае пропустит каждый объект, который не an NSNumber).

Прежде чем вы даже введете цикл for в [MainDict allKeys], backtrace , чтобы убедиться, что вы фактически передаете массивы NSNumber в качестве объектов словарей.


ЕСЛИ вы на самом деле не уверены в типах объектов, вы можете просто бросить флаг, чтобы убедиться, что вы не неправильно интерпретируете ни один из объектов:

...

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, чтобы искать свои поплавки.

В противном случае, я предлагаю глубоко погрузиться в how и , где откуда вы получаете MainDict.

Счастливого кодирования - ура!

...