Objective-CでiOSアプリを作ってる時にサーバからJSON形式で渡されて来たデータをNSDictionaryに保管したのち、添字アクセスでデータを取り出そうとしたら暗黙的に型変換がおきてクラッシュするという事象が確認できた。
- 該当のソース
// コールバックでJSONデータ受信
- (void)onReceived:(NSDictionary *)dict {
NSDictionary *dataDict = dict[@"data"];
NSArray *data1 = dataDict[@"data1"];
NSArray *data2 = dataDict[@"data2"];
・
・
・
このdict[@"data"]をdataDictに添字アクセスで格納しようとすると、勝手にNS(CF)Stringとして暗黙変換されてしまい、NSStringにobjectForKeyedSubscriptなんてメソッドはないからそこでunrecognized selectorエラーで落ちる。
※必ず落ちるわけではないのがこれがまた厄介。
そこで、添字アクセスをやめてみたら該当のエラーが発生しなくなった。
// コールバックでJSONデータ受信
- (void)onReceived:(NSDictionary *)dict {
NSDictionary *dataDict = (NSDictionary *)[dict objectForKey:@"data"];
NSArray *data1 = (NSArray *)[dataDict objectForKey:@"data1"];
NSArray *data2 = (NSArray *)[dataDict objectForKey:@"data2"];
・
・
・
原因はわからないが、公式の言語仕様である添字アクセスでこういうバグは辛い。
個人的には「とりあえずやってみる精神の塊」であるObjective-Cは好きだが、余計なことはしないでほしいと痛切に思った。
原因を知ってる方がいらっしゃいましたらぜひ教えてください。