※現在解決済みです。
NSDictionaryのdictionaryWithObjectsAndKeysはnilターミネートですので、先頭のnilでNSDictionaryが終端だと認識したと言う話でした。
堀内さんを初め、ありがとうございます!!
少し不可解な動作があったので、読者の皆様に質問をさせて下さい。
NSDictionary *dictionary = [NSDictionary dictionaryWithObject:nil forKey:@"nilKey"]; NSLog(@"dictionary %@", dictionary);
こんなコード。
NSDictionaryにオブジェクトとしてnilを突っ込む方法。
もちろん、これはクラッシュします。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]' *** First throw call stack: (0x1c98012 0x10d5e7e 0x1c5ea95 0x1c6c946 0x2e99 0xfb1c7 0xfb232 0x4a3d5 0x4a76f 0x4a905 0x8deaab6 0x53917 0x2c5b 0x17157 0x17747 0x1894b 0x29cb5 0x2abeb 0x1c698 0x1bf3df9 0x1bf3ad0 0x1c0dbf5 0x1c0d962 0x1c3ebb6 0x1c3df44 0x1c3de1b 0x1817a 0x19ffc 0x2962 0x2895) libc++abi.dylib: terminate called throwing an exception
これは今まで知っていたのですが、問題は以下のコード。
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:nil, @"nilKey", nil]; NSLog(@"dictionary %@", dictionary);
こんなコード。
これもクラッシュし・・・・ない!?
この方法だとnilは[NSNull null]として扱われるのか?
modern Objective-cだとこの様な書き方になります。
NSDictionary *dictionary = @{@"nilKey":string}; NSLog(@"dictionary %@", dictionary);
※stringはnil。
で、もちろんこれも落ちます。
modernObjective-cで書くんだったら、objectとしてdictionaryに挿入する前にnilチェック必要って事なのかなー。
どなたかご存知の方いらっしゃったらお教え下さいませー。
コメント
dictionaryWithObjectsAndKeys:はnil terminated(可変長引数でnilが終端を表す)なので、最初のnilで終端された・・つまり要素0として扱われたということではないでしょうか?