1. 작업 환경
2. 문제 상황
-[__NSDictionaryM floatValue]: unrecognized selector sent to instance 0x60000062fcc0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM floatValue]: unrecognized selector sent to instance 0x60000062fcc0'
*** First throw call stack:
(
0 CoreFoundation 0x0000000180437330 __exceptionPreprocess + 172
1 libobjc.A.dylib 0x0000000180051274 objc_exception_throw + 56
2 CoreFoundation 0x0000000180445e3c +[NSObject(NSObject) instanceMethodSignatureForSelector:] + 0
3 CoreFoundation 0x000000018043b224 forwarding + 1308
4 CoreFoundation 0x000000018043d50c _CF_forwarding_prep_0 + 92
5 CAMS 0x000000010053c95c __42-[DunamuQuotation fetchDataWithCompletion]_block_invoke.209 + 1284
6 CAMS 0x0000000100537c40 __53-[APIManager fetchDataFromAPI:withCompletionHandler:]_block_invoke + 404
7 CFNetwork 0x0000000183d30cf8 CFNetwork + 27896
8 CFNetwork 0x0000000183d4c170 _CFHTTPMessageSetResponseProxyURL + 14628
9 libdispatch.dylib 0x0000000100788528 _dispatch_call_block_and_release + 24
10 libdispatch.dylib 0x0000000100789d50 _dispatch_client_callout + 16
11 libdispatch.dylib 0x0000000100792014 _dispatch_lane_serial_drain + 924
12 libdispatch.dylib 0x0000000100792da4 _dispatch_lane_invoke + 480
13 libdispatch.dylib 0x00000001007a0b74 _dispatch_workloop_worker_thread + 1716
14 libsystem_pthread.dylib 0x00000001b18348fc _pthread_wqthread + 284
15 libsystem_pthread.dylib 0x00000001b18336c0 start_wqthread + 8
)
libc++abi: terminating due to uncaught exception of type NSException
3. 문제 원인
이 오류는 -[__NSDictionaryM floatValue]: unrecognized selector sent to instance 로, __NSDictionaryM 타입의 객체에서 floatValue 메서드를 호출하려고 할 때 발생합니다. __NSDictionaryM은 가변적인 NSDictionary입니다. 그러나 floatValue 메서드는 NSString 또는 NSNumber 클래스의 인스턴스에서만 사용할 수 있습니다. 따라서 이 오류는 잘못된 형식의 객체에 해당 메서드를 사용하려고 시도할 때 발생합니다.
4. 해결 방법 1
올바른 키를 사용하여 값을 가져옵니다: 먼저, 정확한 키를 사용하여 데이터를 가져와야 합니다. 아래 예제 코드를 참조하세요.
NSNumber *number = myDictionary[@"myFloatValue"];
float myFloatValue = [number floatValue];
5. 해결 방법 2
객체의 형식을 확인하고 변환합니다: 값을 가져오기 전에 객체의 형식을 확인합니다. 형식이 올바르지 않으면 알맞게 변환하세요.
id value = myDictionary[@"myFloatValue"];
if ([value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSString class]]) {
float myFloatValue = [value floatValue];
} else {
// Handle the situation when value is not a number or string
}
6. 해결 방법 3
try-catch 블록을 사용하여 예외처리를 수행합니다: 오류가 발생하더라도 앱이 중단되지 않게 하려면 try-catch 블록을 사용하여 예외처리를 수행하세요. try-catch 블록 안에서 코드를 실행하면 오류가 발생하더라도 catch 블록에서 처리할 수 있습니다.
@try {
float myFloatValue = [myDictionary[@"myFloatValue"] floatValue];
} @catch (NSException *exception) {
NSLog(@"Exception - %@", exception);
// Handle the exception or provide a reasonable fallback
}