0

rangeOfString に関連する iOS アプリのバグを何時間も解決しようとしてきましたが、ついにアプリがクラッシュした場所を突き止めることができました。私のアプリは TextViewA を MainTextView の前半に設定します。nil をチェックするために if ステートメントを追加する必要がありますか?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFString rangeOfString:options:range:locale:]: nil argument'
*** First throw call stack:

.

[[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];

................................................................... ...................................................................

現在、プログラムに使用できるメモリがありません: malloc を呼び出すのは安全ではありません

2013-01-04 14:30:58.138 Type[7279:c07] セパレーター: (null)

2013-01-04 14:30:58.138 タイプ [7279:c07] mainTextView: ; レイヤー = ; contentOffset: {0, 0} > 2013-01-04 14:30:58.139 Type[7279:c07] mainTextView.text: TESTTTTTTTT f f f。

2013-01-04 14:30:58.142 Type[7279:c07] * キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '* -[__NSCFString rangeOfString:options:range:locale:]: nil argument'

*最初のスロー コール スタック:

(0x1a5d012 0x1882e7e 0x1a5cdeb 0xf78688 0xf87d88 0xfd05df 0x165ec 0x15dc6 0x1fd7b 0x56d8d5 0x56db3d 0xf74e83 0x1a1c376 0x1a1be06 0x1a03a82 0x1a02f44 0x1a02e1b 0x221d7e3 0x221d668 0x4be65c 0x2c5d 0x2b85)

libc++abi.dylib: 例外をスローして呼び出された終了 (gdb)

4

2 に答える 2

1

このワンライナーは、obj-C では良い習慣とは見なされません (私は知っていますが、それは議論の余地があります)。

壊してみてください:

[[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];

よりデバッグしやすいコードに:

NSString *separator = [[myViewController tvTextMiddle]text];

NSLog (@"separator: %@", separator);
NSLog (@"mainTextView: %@",mainTextView);   //is this one nil?
NSLog (@"myViewController.tvTextMiddle: %@", myViewController.tvTextMiddle); //what about this one??
NSLog (@"mainTextView.text: %@",mainTextView.text);

NSArray *components = [mainTextView.text componentsSeparatedByString:separator];

NSLog (@"we found %d components", components.count);

NSString *result = (NSString *)[components objectAtIndex:0];

NSLog (@"result should be: %@", result);

[[myViewController tvTextFirstHalf] setText:result];

もちろん、コードは壊れますが、少なくとも問題がどこにあるかはわかります。

最後の 4 行を次のように変更できます。

if (components.count >= 1)
{
    NSString *result = (NSString *)[components objectAtIndex:0];
    NSLog (@"result should be: %@", result);
    [[myViewController tvTextFirstHalf] setText:result];    
}
else
{
    [[myViewController tvTextFirstHalf] setText:@"empty!"];
}

編集:

NSLogあなたが投稿したことから、セパレーター[[myViewController tvTextMiddle]text]がnullであることは明らかです。null は空の文字列と同じではないことに注意してください。未割り当て文字列です。

私の推測では、実際にtvTextMiddleは null です (または、XIB ファイルを使用している場合は、に正しく接続されていませんIBOutlet)。

(改行の前のどこかに)追加することで確認できます:

NSLog (@"myViewController.tvTextMiddle: %@", myViewController.tvTextMiddle);
于 2013-01-04T19:18:00.933 に答える
0

クラッシュはこの呼び出しによるものcomponentsSeparatedByStringです。テキストビューが nil またはテキストがない場合、クラッシュが発生します。

したがって、次のような条件を追加します。

if(mainTextView.text.length != 0 && [myViewController tvTextMiddle]text].length != 0)
{
  [[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];
}
于 2013-01-04T19:15:09.383 に答える