5

しばらくして認識されないセレクターがインスタンス例外に送信されました。これを取得したら、スキップしたいだけで、アプリが動作するはずです。

しかし、私はキャッチする方法を知りません。これはキャッチしないので:

@property(nonatomic,retain) UIButton *button;
    @try{

       if(button.currentBackgroundImage == nil){//rises exception 
    }
    }@catch(NSException *e){
}

どうすればこれを処理できますか?

ありがとう。

4

3 に答える 3

6

私がよく使用する手法は、例外をキャッチする代わりに、オブジェクトがセレクターに応答するかどうかを確認することです。

if(![button respondsToSelector:@selector(currentBackgroundImage)] || button.currentBackgroundImage == nil) {
  // do your thing here...
}
于 2012-06-21T05:33:04.790 に答える
2

この例外が発生する場合は、コードに設計上の欠陥、バグがあることを意味します。例外を無視してパッチを当てることは正しいことではありません。代わりに、間違ったメッセージを間違ったオブジェクトに送信している理由を突き止めてみてください。コードはより堅牢で保守しやすくなります。

また、オブジェクトが元々正しい型であったが、割り当て解除の途中である場合に、この例外が発生することがあります。気を付けて!

それでも例外をバイパスしたい場合は、実行時にメッセージがメソッド実装にバインドされるマルチステップ プロセスについて説明している Apple のドキュメントを参照してください。NSObject のデフォルトの動作をオーバーライドすることで、キャッチできる場所が少なくとも 2 つあります。

于 2012-06-21T06:24:35.807 に答える
2

それが好ましい方法であるため、認識されないセレクターを防ぐように言っている答えを理解しています。

しかし、そのオプションがない場合 (私の場合、Cocoa の内部がコール スタックのさらに下で混乱している場合など) は、認識されていないセレクターを実際にキャッチすることができます。

概念実証コード:

// Do a really bad cast from NSObject to NSButton
// to get something to demonstrate on
NSButton *object = (NSButton*)[[NSObject alloc] init];

@try{
    // Log the description as the method exists 
    // on both NSObject and NSButton
    NSLog(@"%@", [object description]);

    // Send an unrecognized selector to NSObject
    [object bounds];
} @catch(NSException *e){
    NSLog(@"Catch");
} @finally {
    NSLog(@"Finally");
}

// Print the description to prove continued execution
NSLog(@"Description again: %@", [object description]);

出力:

2019-02-26 14:11:04.246050+0100 app[46152:172456] <NSObject: 0x60000000a6f0>
2019-02-26 14:11:04.246130+0100 app[46152:172456] -[NSObject bounds]: unrecognized selector sent to instance 0x60000000a6f0
2019-02-26 14:11:04.246226+0100 app[46152:172456] Catch
2019-02-26 14:11:04.246242+0100 app[46152:172456] Finally
2019-02-26 14:11:04.246258+0100 app[46152:172456] Description again: <NSObject: 0x60000000a6f0>

ご覧のとおり、例外は引き続きコンソールに記録されますが、コードの実行は続行されます。

于 2019-02-26T13:17:53.907 に答える