7

我一直在为 XCode 使用的一个有用技巧是在 exceptions 上添加断点

我想知道为什么我们需要添加两个断点——一个 forobjc_exception_throw和一个 for [NSException raise]

什么情况下一个覆盖,另一个不覆盖?

4

2 回答 2

4

您应该只在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将起作用。

于 2012-06-19T13:13:11.277 回答
0

以下是 Apple 文档中关于异常的内容:

@throw 和 raise 之间的一个重要区别是后者只能发送到 NSException 对象,而 @throw 可以将其他类型的对象作为其参数(例如字符串对象)。Cocoa 应用程序应该只@throw NSException 对象。

这意味着如果您正在实现 aCocoa applciation project并且如果您严格遵循 @throw 只有NSExeption对象,它们是相同的。

参考:链接

于 2015-01-18T00:46:38.417 回答