NSNull and nil differ

今日のハマリ

さっき、cruxbookのv1.0.3のアップデートが公開されたのでウキウキしながらアップデートしました

これでやっと課題検索が動く…と、課題検索をしてみるとバッチリ動いています

しかし、その後の検索結果からの課題の詳細を見ようとするとアプリが落ちる!!!

なんでー?? テストの時はそんなことなかったのにな~ と思い焦りながらも、開発環境のソースコードのサービスアクセス先を本番環境のサーバに変えて試してみたところ、落ちた~!! デバッガーで追ってみると、どうやら課題のコメントが入力されていない場合に落ちる様子

課題詳細画面のcellForRowAtIndexPath:ではこんな処理をしている

[cpp]
// メモ
NSString *string = [self.problem valueForKey:@"comment"];
UITextView *view = (UITextView *)[cell viewWithTag:2];
if (view == nil) {
view = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 280)];
view.tag = 2;
view.editable = NO;
view.backgroundColor = [UIColor clearColor];
[cell addSubview:view];
}
view.text = string;
[/cpp]

このstringが悪さをしているみたいだ。UITextViewがこれに対してなんらかの処理をしようとするときに落ちている。そんなわけで、最初はこのようにコードを変えてみた

[cpp]
// メモ
NSString *string = [self.problem valueForKey:@"comment"];
UITextView *view = (UITextView *)[cell viewWithTag:2];
if (view == nil) {
view = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 280)];
view.tag = 2;
view.editable = NO;
view.backgroundColor = [UIColor clearColor];
[cell addSubview:view];
}
if (string) {
view.text = string;
}
[/cpp]

つまり、if (string != nil) と同じ解釈。でも、これでは不等式は成立せずにview.textにstringが代入されてしまう。結果、アプリも落ちる。調べてみたところ、このstringがnilなのかと思いきやそうでもないようだ

http://d.hatena.ne.jp/shoby/20110319/1300567422

こちらを参考に下記のように修正したところ、うまく動いた

[cpp]
// メモ
NSString *string = [self.problem valueForKey:@"comment"];
UITextView *view = (UITextView *)[cell viewWithTag:2];
if (view == nil) {
view = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 280)];
view.tag = 2;
view.editable = NO;
view.backgroundColor = [UIColor clearColor];
[cell addSubview:view];
}
if (![string isEqual:[NSNull null]]) {
view.text = string;
}
[/cpp]

それはいいのだが、このアップデートが反映されるまでいますぐにアップデートを提出しても1週間はかかる!!! やべぇなぁ、どうしよう、と思ったんだけど、とりあえずサーバ側で

[sql]

sql> update problem set comment = ‘ ‘ where comment is null;

[/sql]

したったww これでとりあえず表示されている


投稿日

カテゴリー:

投稿者:

タグ:

コメント

“NSNull and nil differ” への1件のコメント

  1. […] いるhc100氏が開発したアプリもいい感じ!本番DBにいきなり空文字差し込んだり、みたいなのも良いよね〜。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です