1

これNSUserDefaultsにより、iOS6 SDK で例外が発生します。例外は次のとおりです。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(0x3527a2a3 0x32d7a97f 0x351cb55f 0x352020d3 0xe2f9d 0x351cb037 0x372a1d91 0x372aa13b 0xcd813 0x34e36f1f 0x34e379a9 0x36d5d35d 0x3524f173 0x3524f117 0x3524df99 0x351c0ebd 0x351c0d49 0x32e762eb 0x34c38301 0xcc20f 0xc5e40)
libc++abi.dylib: terminate called throwing an exception

コードは次のとおりです。

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *shortVersionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
// the shortVersionString is 2.0.1
[ud setBool:YES forKey:@"hasBeenLaunched"];
[ud setObject:shortVersionString forKey:@"CurrentVersion"];

コメントアウトする[ud setBool:YES forKey:@"hasBeenLaunched"];[ud setObject:shortVersionString forKey:@"CurrentVersion"];、アプリは正常に動作します。

誰でも助けることができますか?どうもありがとう!

4

2 に答える 2

1

通知を登録しNSUserDefaultsDidChangeNotification、NSUserDefaults の設定を変更すると、通知メソッドが呼び出されます。一部の変数は最初の起動前は nil であり、それらの変数を NSUserDefaults に保存するため、クラッシュが発生しました。

于 2012-09-25T02:15:42.800 に答える
1

ログ メッセージを追加すると、バージョン文字列が nil であることがわかります。デフォルトに nil を書き込むことはできません。これが失敗の原因です。

NSString *shortVersionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSLog(@"Bet this is nil: %@", shortVersionString);
NSLog(@"Get ready for crash");
[ud setObject:shortVersionString forKey:@"CurrentVersion"];
NSLog(@"Guess I was wrong - no crash :-(");
于 2012-09-24T11:40:08.487 に答える