我一直在为 XCode 使用的一个有用技巧是在 exceptions 上添加断点。
我想知道为什么我们需要添加两个断点——一个 forobjc_exception_throw
和一个 for [NSException raise]
。
什么情况下一个覆盖,另一个不覆盖?
我一直在为 XCode 使用的一个有用技巧是在 exceptions 上添加断点。
我想知道为什么我们需要添加两个断点——一个 forobjc_exception_throw
和一个 for [NSException raise]
。
什么情况下一个覆盖,另一个不覆盖?
您应该只在objc_exception_throw
. 该方法-[NSException raise]
调用objc_exception_throw
,因此objc_exception_throw
涵盖了所有-[NSException raise]
涵盖的情况。反之则不正确:该@throw
指令被编译为objc_exception_throw
直接调用。这种方法显示了差异:
- (void)throwAndCatch
{
@try {
NSException *exception = [[NSException alloc] initWithName:@"Test"
reason:@"test"
userInfo:nil];
@throw exception;
}
@catch (NSException *exception) {
NSLog(@"Caught");
}
}
调用 时-throwAndCatch
,断点 on-[NSException raise]
无效,而断点 onobjc_exception_throw
将起作用。
以下是 Apple 文档中关于异常的内容:
@throw 和 raise 之间的一个重要区别是后者只能发送到 NSException 对象,而 @throw 可以将其他类型的对象作为其参数(例如字符串对象)。Cocoa 应用程序应该只@throw NSException 对象。
这意味着如果您正在实现 aCocoa applciation project
并且如果您严格遵循 @throw 只有NSExeption
对象,它们是相同的。
参考:链接