実際のユーザーが誤って実行する可能性が低い特定のアクションをユーザーが実行したときに、意図的にアプリをクラッシュさせて、アプリのクラッシュ レポートを現場でテストしたいと考えています。
しかし、コンパイル時に警告を出さずにアプリをクラッシュさせる信頼できる方法は何ですか?
編集:この質問に対する一見明白な回答の多くは、Cocoa によってキャッチされる例外が発生するため、アプリがクラッシュすることはないことに注意してください。
実際のユーザーが誤って実行する可能性が低い特定のアクションをユーザーが実行したときに、意図的にアプリをクラッシュさせて、アプリのクラッシュ レポートを現場でテストしたいと考えています。
しかし、コンパイル時に警告を出さずにアプリをクラッシュさせる信頼できる方法は何ですか?
編集:この質問に対する一見明白な回答の多くは、Cocoa によってキャッチされる例外が発生するため、アプリがクラッシュすることはないことに注意してください。
Objective-Cでは、Cを直接使用して不正なアクセスを引き起こします
strcpy(0, "bla");
注:これは私が知っているどのシステムでも機能しますが、Cランタイムまたはコンパイラの将来のバージョンでは、これでクラッシュが発生しなくなる可能性があります。ヌルポインタはObjective-Cの未定義の動作を逆参照していますか?を参照してください。)。
(迅速にこれを行うには、objCにブリッジする必要があります)
私たちは皆 Clang for iOS を使用しているので、これはかなり信頼できます。
__builtin_trap();
これには、まさにこの目的のために設計されているという利点があるため、コンパイラの警告やエラーは生成されません。
古き良きスタックオーバーフローはどうですか:)
- (void)stackOverflow
{
[self stackOverflow];
}
abort();
異常終了… クラッシュです。
最も一般的なもの - 認識されないセレクターのクラッシュ:
NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];
-asdf メソッドがそのクラスに実装されていないことを確認してください (笑)
または、バインドされた例外を超えたインデックス:
NSArray * array = [NSArray array];
[array objectAtIndex:5];
そしてもちろん
kill( getpid(), SIGABRT );
Swift では、致命的なエラーを簡単にスローできると思います。
func foo() {
fatalError("crash!")
}
アプリをクラッシュさせるために何か問題が発生した場合に備えて、実際にはこの機能を使用することさえ意図されています.
特殊なケースで if ステートメントを避けるために、 も使用できますprecondition
。これは に似ている assert
ため、(必要に応じて) 意図が明確になり、最終リリースでは として削除されませんassert
。のように使われprecondition(myBoolean, "This is a helpful error message for debugging.")
ます。
割り当て解除されたオブジェクトにメッセージを送信する
exit(0);
(必ず...タイプ... 30文字)
例外を発生させることもできます。
[NSException raise:NSInternalInconsistencyException
format:@"I want to test app crashes!."];
10 本の指でのタップを認識するビューにジェスチャ レコグナイザーを追加します (iPhone の場合は 5 本の指で、10 本の指は少し混雑する可能性があります)。GR には、前述のアプリをクラッシュさせる確実な方法のいずれかを実行するメソッドがアタッチされています。ほとんどのユーザーはアプリに 10 本の指を置きません。そのため、一般ユーザーが誤ってクラッシュを引き起こすことはありません。
ただし、Testflight のようなものを使用するか、それを個人のデバイスにデプロイして、Apple に提出する前に実際にテストすることができるはずです。強制的なクラッシュが発生すると、アプリが Apple によって拒否される可能性があります。
私は一緒に行きます:int raise(int sig);
詳細情報を取得するには>man raise
RubyMotion を使用するときは、これを使用します。
n=Pointer.new ('c', 1)
n[1000] ='h'
私が使う
[self doesNotRecognizeSelector:_cmd];
私はプロセスを普通に殺すだけです:
kill(getpid(), SIGKILL);
したがって、シグナル付きのハンドラーをインストールすると、クラッシュを処理して、開いているファイルの書き込みなどを終了することもできます。
間違ったNSLog
ステートメントはそれを行います
NSLog(@"%@",1);