2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Objective-C]NSDictionaryに添字アクセスした際にクラッシュする

Posted at

Objective-CでiOSアプリを作ってる時にサーバからJSON形式で渡されて来たデータをNSDictionaryに保管したのち、添字アクセスでデータを取り出そうとしたら暗黙的に型変換がおきてクラッシュするという事象が確認できた。

image.png

  • 該当のソース
// コールバックで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は好きだが、余計なことはしないでほしいと痛切に思った。

原因を知ってる方がいらっしゃいましたらぜひ教えてください。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?