5

NSAssert予期しない状況が発生した場合、アプリケーションがすぐに失敗してクラッシュ ログに意味のあるメッセージが表示されるように、iPhone アプリ全体で使用しようとしています。

これは、失敗NSAssertがメインスレッドにある場合、NSInternalInconsistencyExceptionデフォルトで発生し、キャッチされずに実行を停止するため、正常に機能します。しかし、私はバックグラウンド スレッドでも処理を行っています。この場合、NSAssertスレッドは中止されますが、プログラミングは実行され続けます。

私の現在の解決策は、メイン スレッド (この場合はNSOperationmainメソッド) で例外をキャッチして再スローすることです。

- (void)main {
    @try {
        int x = 14;
        ...
        NSAssert1(x > 20, @"x should be greater than 20, was %d", x);
        ...
    }
    @catch (NSException *e) {
        [e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES];
    }
}

より良い方法はありますか?おそらくカスタム NSAssertionHandler を使用していますか?

assert私は、静的注釈でC を使用できることを知っています。

assert(x > 20 && "x should be greater than 20");

しかし、これでは の実際の失敗値が何であるかを示すことはできませんx

4

1 に答える 1

1

NSAssertをテストコードに置き換えて、その後に例外を発生させることができます。このようにして、アサーションが失敗した場合、例外がスローされ、@catchブロックによってキャッチされ、メイン スレッドで再発生します。

注: コンパクトなフォームを提供するために、C マクロを定義することもできます。

于 2010-01-07T09:33:18.033 に答える