デバッグ モードでコンパイルする場合に、メソッドが同じ名前のサブクラスによって呼び出されていることを確認するマクロを作成しました (外部クラスによる呼び出しを停止するため)。そうでない場合は、例外がスローされます。
#ifdef DEBUG
#define CHECK_INHERITANCE() \
do { \
NSString *this = [NSThread callStackSymbols][0]; \
NSString *parent = [NSThread callStackSymbols][1]; \
NSError *error = NULL; \
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[\\w+ ((\\w+:)+)\\]" options:NSRegularExpressionCaseInsensitive error:&error]; \
NSTextCheckingResult *resultThis = [regex firstMatchInString:this options:0 range:NSMakeRange(0, this.length)]; \
NSString *strThis = [this substringWithRange:[resultThis rangeAtIndex:1]]; \
NSTextCheckingResult *resultParent = [regex firstMatchInString:parent options:0 range:NSMakeRange(0, parent.length)]; \
NSString *strParent = [parent substringWithRange:[resultParent rangeAtIndex:1]]; \
if(![strThis isEqualToString:strParent]) [NSException raise:NSGenericException format:@"Must be called from a subclass"]; \
} while (0);
#else
#define CHECK_INHERITANCE() //
#endif
私はそれをテストして動作しましたNSException
が、クラッシュした理由を示唆するスタックトレースはスローされず、 「サブクラスから呼び出される必要があります」というメッセージも表示されません。0 __kill
メインスレッドとアセンブラの行で「」を取得するだけです。より有用な例外をスローするにはどうすればよいですか? 私はそれを間違っていますか?