2016-03-31 10 views
2

'leave-logic'は機能しますが、NSMutableDictionaryをNSUserDefaultsに保存する際に問題があります。次のコードNSMutableDictionaryをNSUserDefaultsに保存するとアプリケーションがクラッシュする

@implementation LoginService 
{ 
    NSUserDefaults *prefs; 
} 

- (void) parseResponse:(NSDictionary*) dictionary 
{ 
    NSMutableDictionary *dic=[[NSMutableDictionary alloc]initWithDictionary:dictionary]; 
    prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setObject:dic forKey:@“setKey”]; 
    [prefs synchronize]; 
} 

私に次のクラッシュを与える:キーSETKEYためNSUserDefaults/CFPreferences値として

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object { 
    result =  { 
     email = ""; 
     group = 1; 
     locations = ""; 
     "login_id" = ""; 
     photo = ""; 
     status = 1; 
    }; 
} for key setKey' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000110e66e65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x00000001108b6deb objc_exception_throw + 48 
    2 CoreFoundation      0x0000000110e66d9d +[NSException raise:format:] + 205 
    3 CoreFoundation      0x0000000110e26ef5 _CFPrefsValidateValueForKey + 149 
    4 CoreFoundation      0x0000000110e69a49 -[CFPrefsPlistSource sendMessageSettingValue:forKey:] + 217 
    5 CoreFoundation      0x0000000110d9e5b7 -[CFPrefsPlistSource alreadylocked_setValue:forKey:] + 311 
    6 CoreFoundation      0x0000000110d9e44e -[CFPrefsSource setValue:forKey:] + 62 
    7 CoreFoundation      0x0000000110d5b991 +[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:] + 1105 
    8 CoreFoundation      0x0000000110d9e3b2 _CFPreferencesSetValueWithContainer + 306 
    9 Foundation       0x0000000110244b25 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 46 
    10 test 2015       0x000000010b5f2051 -[LoginService parseResponse:] + 5025 
    11 test 2015       0x000000010b567348 -[WebService successResponse:] + 104 
    12 test 2015       0x000000010b56693f __22-[WebService GETstart]_block_invoke + 127 
    13 test 2015       0x000000010b495d0b __74+[AFJSONRequestOperation JSONRequestOperationWithRequest:success:failure:]_block_invoke + 203 
    14 test 2015       0x000000010b4970d3 __64-[AFJSONRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke78 + 51 
    15 libdispatch.dylib     0x00000001113d1e5d _dispatch_call_block_and_release + 12 
    16 libdispatch.dylib     0x00000001113f249b _dispatch_client_callout + 8 
    17 libdispatch.dylib     0x00000001113da2af _dispatch_main_queue_callback_4CF + 1738 
    18 CoreFoundation      0x0000000110dc6d09 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    19 CoreFoundation      0x0000000110d882c9 __CFRunLoopRun + 2073 
    20 CoreFoundation      0x0000000110d87828 CFRunLoopRunSpecific + 488 
    21 GraphicsServices     0x000000011275dad2 GSEventRunModal + 161 
    22 UIKit        0x000000010ecfb610 UIApplicationMain + 171 
    23 test 2015       0x000000010b44fdbf main + 111 
    24 libdyld.dylib      0x000000011142692d start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 
+0

nilの値で辞書を登録することはできません –

答えて

0

私が最初に考えた」のキーを使用していることでしたsetKey "はあなたが設定できる最悪の事柄でした。 "set"や "key"という単語を使わずに別のキーを試してみてください。 "testing"のようなものです。

また、NSMutableDictionaryの理由は、普通の古い辞書ではどうなるのでしょうか。それを読み返すときは、NSDictionaryでNSMutableDictionaryを初期化してください。

0

まず第一に、あなたがNSUserDefaultsに(NSMutableDictionaryのような)可変クラスのインスタンスを作成する場合でも、あなたが読み出したオブジェクトは常に不変になることに注意してください。渡されたNSDictionaryNSUserDefaultsに直接保存することができました。しかし、それは問題を解決しません。

明らかに、デバッグメッセージから、保存しようとしている辞書はプロパティリストオブジェクトと見なされません。正確に何が間違っているかを確認するには、次の条件が満たされていることを確認してください:NSDictionaryをプロパティリストにするには、その値もすべて一致する必要があります。

既定では、プロパティリストクラスはNSDictionary,NSArray,NSString,NSDate,NSDataおよびNSNumberです。そうではないかもしれませんが、おそらく "辞書"のオブジェクトはNSDictionaryではありませんか?チェックそれはのようなイントロスペクションを使用して、実行時にクラスです:

NSLog(@"actually it's a %@", [dictionary class]) 

NSDictionaryが、それがすべてのキーがNSStringsある唯一の場合、プロパティリストオブジェクトと見なされることに注意してください。

上記以外のクラスのインスタンスを格納しようとすると、これらのオブジェクトはNSCodingプロトコルに準拠する必要があるため、プロパティリスト互換オブジェクトであるNSDataオブジェクトにアーカイブできます。したがって、オブジェクトをNSDataオブジェクトとして保存して後で復元することができます。あなたがアクションでSEにこれをしたい場合は、AppleのDocumentation からexample code is here.

+0

辞書はおそらく非プロパティリストタイプの値を含んでいると思います。辞書はNSDictionaryではありません – nielsbot

1

は、値のパラメータは、プロパティリストオブジェクトを指定できますNSDataの、NSStringの、のNSNumber、NSDate、NSArrayの、またはNSDictionaryの。 NSArrayオブジェクトとNSDictionaryオブジェクトの場合、の内容はプロパティリストオブジェクトでなければなりません。 「プロパティリストとは」を参照してください。 Property List Programming Guide

ディクショナリのすべてがプロパティリストオブジェクトであることを確認します。すべてがオブジェクトでなければならないため、単純なintは機能しません。

したがって、まず辞書のすべての値を調べ、ints/boolをNSNumberに変換して辞書に保存してからNSUserDefaultsに戻します。

エラーから、辞書に整数が含まれていることがわかりますが、これが原因で問題が発生する可能性があります。

result =  { 
     email = ""; 
     group = 1; //This Line here 
     locations = ""; 
     "login_id" = ""; 
     photo = ""; 
     status = 1; //This line here 
    }; 

上記の行がNSNumberオブジェクトであることを確認してください。

関連する問題