Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSInvalidArgumentException -[__NSCFString unsignedLongLongValue]: unrecognized selector sent to instance

While using JSONModel to parse my models I found this Exception.

NSInvalidArgumentException -[__NSCFString unsignedLongLongValue]: unrecognized selector sent to instance 0x1782210c0

The problem got place inside JSONModel.m because it depends on [NSObject setValue:forKey:].

I found a way to easily reproducing it.

@property NSUInteger uintegerProperty;
[...]
[self setValue:@"1" forKey:@"uintegerProperty"];

This works on 32 bits because setValue ends up calling longLongVaue defined in NSString, but in the case of 64 bits it's calling unsignedLongLongValue which is undefined in NSString.

In my particular case, the problem is this enum used in a model.

typedef NS_ENUM(NSUInteger, kNotificationTypeEnum)
{
    kNotificationTypeResponse = 1,
    kNotificationTypeAlert = 2
};

What is the best way to handle this situation?

Stack trace

2014-12-31 17:48:43.789 mobile-iOS[17851:613] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString unsignedLongLongValue]: unrecognized selector sent to instance 0x10f1feeb0'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000111b99495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001118f099e objc_exception_throw + 43
    2   CoreFoundation                      0x0000000111c2a65d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x0000000111b8ad8d ___forwarding___ + 973
    4   CoreFoundation                      0x0000000111b8a938 _CF_forwarding_prep_0 + 120
    5   Foundation                          0x000000010ff2449b _NSSetUnsignedLongLongValueForKeyWithMethod + 63
    6   Foundation                          0x000000010fed5530 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 259
    7   mobile-iOS                          0x000000010ee1834c -[AppDelegate application:didFinishLaunchingWithOptions:] + 140
    8   UIKit                               0x000000011051b3d9 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 264
    9   UIKit                               0x000000011051bbe1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1605
    10  UIKit                               0x000000011051fa0c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660
    11  UIKit                               0x0000000110530d4c -[UIApplication handleEvent:withNewEvent:] + 3189
    12  UIKit                               0x0000000110531216 -[UIApplication sendEvent:] + 79
    13  mobile-iOS                          0x000000010eedf48b -[MMApplication sendEvent:] + 331
    14  UIKit                               0x0000000110521086 _UIApplicationHandleEvent + 578
    15  GraphicsServices                    0x0000000112df671a _PurpleEventCallback + 762
    16  GraphicsServices                    0x0000000112df61e1 PurpleEventCallback + 35
    17  CoreFoundation                      0x0000000111b1b679 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    18  CoreFoundation                      0x0000000111b1b44e __CFRunLoopDoSource1 + 478
    19  CoreFoundation                      0x0000000111b44903 __CFRunLoopRun + 1939
    20  CoreFoundation                      0x0000000111b43d83 CFRunLoopRunSpecific + 467
    21  UIKit                               0x000000011051f2e1 -[UIApplication _run] + 609
    22  UIKit                               0x0000000110520e33 UIApplicationMain + 1010
    23  mobile-iOS                          0x000000010ee2af23 main + 243
    24  libdyld.dylib                       0x000000011230b5c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Signal: 6 (signal SIGABRT)
like image 222
7ynk3r Avatar asked Dec 31 '14 19:12

7ynk3r


1 Answers

The easiest way is probably to just use a shorter integer type for the property, like uint32_t. The second easiest would be to add a category on NSString that provides the missing method.

like image 176
Mark Bessey Avatar answered Nov 15 '22 16:11

Mark Bessey