それが好ましい方法であるため、認識されないセレクターを防ぐように言っている答えを理解しています。
しかし、そのオプションがない場合 (私の場合、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>
ご覧のとおり、例外は引き続きコンソールに記録されますが、コードの実行は続行されます。