我创建了一个宏,如果在调试模式下编译,将检查以确保该方法已被具有相同名称的子类调用(以阻止外部类调用它)。如果不是这样,它将抛出异常:
#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
”和一堆汇编程序。我怎么能让它给我一个更有用的例外?我做错了吗?