Преобразование NSNumber в число с плавающей точкой вызывает у меня «необработанное исключение« NSInvalidArgumentException » - PullRequest
0 голосов
/ 22 апреля 2011

Я пытаюсь взять EXIF-данные с iPhone для расчета яркости. Мне нужно получить доступ к двум конкретным NSNumber ExifExposureTime и ExifISOSpeed ​​для преобразования в числа с плавающей точкой, но когда я пытаюсь преобразовать их в число с плавающей точкой, я получаю эту ошибку:

"2011-04-21 17: 38: 31.776 POP [11910: 207] - [__ NSCFArray floatValue]: нераспознанный селектор отправлен в экземпляр 0x4b48f70 2011-04-21 17: 38: 31.777 POP [11910: 207] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSCFArray floatValue]: нераспознанный селектор отправлен в экземпляр 0x4b48f70' "

Есть ли какая-то глупая ошибка, которую я упускаю? Пожалуйста, дайте мне знать. Ниже мой код:

-(IBAction)getDataOne:(id)sender {
    NSString *aPath = [[NSBundle mainBundle] pathForResource:@"IMG_0062" ofType:@"JPG"];

    NSURL *url = [NSURL fileURLWithPath:aPath];

    CGImageSourceRef sourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

    NSDictionary *immutableMetadata = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(sourceRef,0,NULL);

    NSDictionary *exifDic = [immutableMetadata objectForKey:(NSString *)kCGImagePropertyExifDictionary];

    NSNumber *ExifApertureValue  = [exifDic objectForKey:(NSString*)kCGImagePropertyExifApertureValue];
    NSNumber *ExifShutterSpeed  = [exifDic objectForKey:(NSString*)kCGImagePropertyExifShutterSpeedValue];
    NSNumber *ExifExposureTime  = [exifDic objectForKey:(NSString*)kCGImagePropertyExifExposureTime];
    NSNumber *ExifFStop  = [exifDic objectForKey:(NSString*)kCGImagePropertyExifFNumber];
    NSNumber *ExifISOSpeed  = [exifDic objectForKey:(NSString*)kCGImagePropertyExifISOSpeedRatings];

    NSLog(@"ExifApertureValue : %@ \n",ExifApertureValue);
    NSLog(@"ExifShutterSpeed : %@ \n",ExifShutterSpeed);
    NSLog(@"ExifExposureTime : %@ \n",ExifExposureTime);
    NSLog(@"ExifFStop : %@ \n",ExifFStop);
    NSLog(@"ExifISOSpeed : %@ \n",ExifISOSpeed);

    float brightness, T, ISO;
    float K = 12.0;
    float A2 = 7.84;

    T = [ExifExposureTime floatValue];
    ISO = [ExifISOSpeed floatValue];

    brightness = (A2 * K) / (T * ISO);

    [summaryViewController imageOneSuccess];

    [ExifApertureValue release];
    [ExifShutterSpeed release];
    [ExifExposureTime release];
    [ExifFStop release];
    [ExifISOSpeed release];
}

Вот что выводит в этих 5 операторах NSLOG, чтобы показать, что хранятся действительные значения:

2011-04-21 18:05:12.318 POP[12051:207] ExifApertureValue : 2.526069 
2011-04-21 18:05:12.319 POP[12051:207] ExifShutterSpeed : 4.915926 
2011-04-21 18:05:12.321 POP[12051:207] ExifExposureTime : 0.03333334 
2011-04-21 18:05:12.323 POP[12051:207] ExifFStop : 2.4 
2011-04-21 18:05:12.324 POP[12051:207] ExifISOSpeed : (
    640
) 

ОБНОВЛЕНИЕ: я просматривал свои выводы и заметил, что ExifISOSpeed ​​печатает в таком странном виде:

(
640
)

формат. В этом была проблема, когда я конвертировал в float, но кто-нибудь знает, почему он выводит таким образом? Я могу использовать операторы if и определить, является ли он больше 0, поэтому я могу видеть его как число.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Похоже, ExifISOSpeed это NSArray, а не NSNumber.Я бы вернулся к документации;может быть, есть причина, по которой вы возвращаете массив из словаря.

Попробуйте:

1 голос
/ 22 апреля 2011

ExifISOSpeed - это NSArray, а не NSNumber.

Попробуйте:

NSNumber *ExifISOSpeed  = [[exifDic objectForKey:(NSString*)kCGImagePropertyExifISOSpeedRatings] objectAtIndex:0];
...