2017-03-13 5 views
1

私のボタンからこの機能を何度も呼び出すと(何度も気違いのように)、アプリがクラッシュする代わりに例外がスローされ、無視されます。Objective-C - 例外をキャッチしてアプリクラッシュを回避する方法

例外が発生した場合、どのようにクラッシュするのを無視しますか?

ここで、localViewはUIView *localViewです。

- (void)smallLocalView { 
    @try { 
    self.localView.backgroundColor = [UIColor blackColor]; 
    [self.localView.layer removeFromSuperlayer]; 
     //self.localView.opaque = NO; 
    } 
    @catch(NSException *exp) { 
     //NSLog(@">>> failed %@" , exp.reason); 
    NSLog(@"OK - but dont crash!!!"); 
    } 
    @finally { 
    NSLog(@"OK - but dont crash!!!"); 
    } 

} 

enter image description here

EDIT:

enter image description here

+2

一般的にアクセス違反をキャッチすることはできません。この場合、 'self.localView!= nil'のチェックを追加することができます。 – sage444

+0

私は!= nilを適用しましたが、 – YumYumYum

+0

hmm、ok、 'self'または' localView'(またはその両方)がnullのときにクラッシュする可能性があります。コードが破損したときにコードと行を更新してください。 – sage444

答えて

2

は、背景色を変更するときに、メインスレッド上にあることを確認してください。

あなたは、あなたがにしているどのスレッドにチェックするために例外を取得する際、他の左側にスタックトレースを確認し、このように、最初にアサートを追加することができます。また

NSAssert([NSThread isMainThread]); 

smallLocalViewからの呼び出し先に応じて、ビューがロードされていない状態になることがあります。

- (void)smallLocalView { 
    if (!self.isViewLoaded) { 
     return; 
    } 
    ... 
} 
7

tl; dr通常、例外をキャッチしようとするべきではありません。根本原因を修正しようとする必要があります。

興味のある例外は2種類あります。画像に表示されている最初の種類はシステム例外です。プロセッサは、保護されたメモリにアクセスしようとするなどの問題に遭遇しました(通常、ヌルポインタの逆参照を試みることによって呼び出されます)。あなたはそのような種類の例外をキャッチすることはできません。オペレーティングシステムは、プログラムが起動されるとプログラムを終了します。

問題は、ほとんどの場合、localViewが途中で解放されたか、(Edgarの答えによると)メインスレッドにアクセスしていない可能性があります。

他の種類の例外はObjective-C例外です。これは常にプログラムによって発生します。 @try { ... } @catch { ... }ブロックでこれらをキャッチすることはできますが、一般的には禁止してください。その理由は、コード例外を安全にするための強制がないため、データ構造の一貫性を維持するためにリソースの割り当てを解除する必要があるスタックフレームや、クリーンアップが必要なスタックフレームを解放する可能性があるからです。例外がスローされてキャッチされると、プログラムの状態の論理的一貫性を保証することはできません。唯一の本当の選択肢は、可能な限りきれいに終了することです。

関連する問題