2015-05-15 2 views
-2

я создаю одно приложение, в котором я храню мой массив пользовательских объектов в NSUserDefaults, используя этот код ниже:[длина __NSCFNumber]: непризнанные селектор направлен например, с NSUserDefaults

[Util setSubProductsArrayPreference:myArray forKey:productId]; 

//Util.m

+(void)setSubProductsArrayPreference:(NSMutableArray *)subProducts forKey:(NSString *)string 
{ 
    for (int i=0; i<subProducts.count; i++) { 
     SubProducts *po=[subProducts objectAtIndex:i]; 
     NSString *st=[NSString stringWithFormat:@"%d",i]; 
     [Util setSubProductsPreference:po forKey:st]; 

    } 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:subProducts]; 
    [prefs setObject:myEncodedObject forKey:string]; 
    [prefs synchronize]; 
} 


+(void)setSubProductsPreference:(SubProducts *)subProducts forKey:(NSString *)key 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:subProducts]; 
    [prefs setObject:myEncodedObject forKey:key];//here it is crashing 
    [prefs synchronize]; 
} 

Этот код работает отлично с iOS7 и проблема prior..The, когда я бегу мой же код с iOS8 в xCode6 тогда я получаю ошибку ниже:

-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000f23 

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000f23' 

*** First throw call stack: 
(
    0 CoreFoundation      0x00000001042fbf35 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000103bbabb7 objc_exception_throw + 45 
    2 CoreFoundation      0x000000010430304d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x000000010425b27c ___forwarding___ + 988 
    4 CoreFoundation      0x000000010425ae18 _CF_forwarding_prep_0 + 120 
    5 CoreFoundation      0x00000001042bc790 _CFPrefsEncodeKeyValuePairIntoMessage + 64 
    6 CoreFoundation      0x00000001042fe286 -[CFPrefsPlistSource sendMessageSettingValue:forKey:] + 102 
    7 CoreFoundation      0x000000010423cef7 -[CFPrefsPlistSource alreadylocked_setValue:forKey:] + 215 
    8 CoreFoundation      0x000000010423cdee -[CFPrefsSource setValue:forKey:] + 62 
    9 CoreFoundation      0x00000001041fa1f8 +[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:] + 1112 
    10 CoreFoundation      0x000000010423cd63 _CFPreferencesSetValueWithContainer + 227 
    11 Foundation       0x000000010374099b -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 46 
    12 HP ProTrain       0x0000000101186787 +[Util setSubProductsArrayPreference:forKey:] + 487 
    13 HP ProTrain       0x0000000101115a38 __74-[DesktopProductsViewController fetchingProductSubCategoryDataFromServer:]_block_invoke_2 + 3096 
    14 libdispatch.dylib     0x00000001051b4ba6 _dispatch_call_block_and_release + 12 
    15 libdispatch.dylib     0x00000001051d27f4 _dispatch_client_callout + 8 
    16 libdispatch.dylib     0x00000001051bb8fb _dispatch_main_queue_callback_4CF + 949 
    17 CoreFoundation      0x0000000104263fe9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    18 CoreFoundation      0x0000000104226eeb __CFRunLoopRun + 2043 
    19 CoreFoundation      0x0000000104226486 CFRunLoopRunSpecific + 470 
    20 GraphicsServices     0x00000001082c29f0 GSEventRunModal + 161 
    21 UIKit        0x0000000102463420 UIApplicationMain + 1282 
    22 HP ProTrain       0x00000001010c1a87 main + 151 
    23 libdyld.dylib      0x0000000105207145 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Есть ли у кого-нибудь еще такая же проблема?

+0

Существует несоответствие между индиктом, где происходит сбой и StackTrace: StackTrace говорит, что сбой в 'setSubProductsArrayPreference' в то время как вы утверждаете, он выходит из строя внутри 'setSubProductsPreference' – luk2302

+0

Почему downvote, что не так в моем вопросе? –

+0

1) Обозначьте журнал сбоев. 2) После того, как у вас есть информация о номере линии с шага 1, укажите точную строку кода, вызывающую сбой. 3) Отладить приложение и посмотреть, почему вы получаете объект NSNumber, где вы ожидали объект 'NSString'. – rmaddy

ответ

0

Изменения этой линией

[Util setSubProductsArrayPreference:myArray forKey:[NSString stringWithFormat:@"%@",productId]]; 
+0

Спасибо alot @Kalpesh .. –

+0

Это не правильное решение. Вы говорите, что код работал в iOS 7, но не в iOS 8. Правильное решение - это устранить причину проблемы. Это решение просто скрывает проблему, преобразовывая неожиданный объект NSNumber в 'NSString'. Устраните проблему, вместо того, чтобы применять полоску, которая скрывает ее. – rmaddy

0

Простой, ваш productId не возвращает строку. Просто типаж productId в NSString до того setObject.

+0

Если 'productId' является' NSNumber', то его использование в 'NSString' не решит проблему вообще. Произойдет такая же ошибка. – rmaddy

+0

Я думаю, что пользователь уже принял ответ, он действительно решил проблему, которая выдает ошибку в соответствии с кодом. Мы только что указали, что «productId» вызывает ошибку, OP достаточно умен, чтобы решить более позднюю часть. – Vizllx

+0

«NSNumber для NSString», это неправильно, должно быть «для NSString». Anways Это решило проблему, вызвавшую появление NSNumber, OP не знает, где произошел сбой, поэтому другие пользователи указали на это. Таким образом, комментарий не имеет никакого отношения к ответу. – Vizllx