gpt4 book ai didi

iphone - 使用 NSSetUncaughtExceptionHandler 在 Objective C 中注册 UncaughtExceptionHandler

转载 作者:可可西里 更新时间:2023-11-01 04:16:30 27 4
gpt4 key购买 nike

我使用UncaughtExceptionHandler 注册未捕获异常处理器的代码如下,你认为会有什么潜在的问题吗?

@interface AppDelegate ()

void myHandler(NSException * exception);

@end

@implementation AppDelegate

void myHandler(NSException * exception)
{
// ...
}

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&myHandler);
..

有没有更简洁的写法?

我需要使用类扩展来声明原型(prototype),以便摆脱 No previous prototype for function ..

的警告

最佳答案

马丁的回答是正确的。但是,我想我会详细说明一下,以解释为什么会这样。

你的函数定义:

void myHandler(NSException * exception)
{
// ...
}

定义一个外部可见的函数。换句话说(广义的,非技术性的),将在目标文件中创建一个符号,以便链接器可以找到它,这允许其他文件调用 myHandler

但是,因为它应该是外部可见的,所以其他文件将不得不知道该函数的外观。这就是原型(prototype)发挥作用的地方。警告基本上是在说......

Hey, you have declared this function to be externally visible to other code, but I don't see a prototype that other code can use to know about the function.

因此,您会收到警告。这是一个很好的警告。它可以帮助您记住为要导出的函数声明原型(prototype)。

现在,正如您发现的那样,您可以声明一个原型(prototype),然后警告就会消失。但是,仅在实现文件中声明原型(prototype)应该是对您的另一个警告。个人警告应该是:

你真的希望这个函数具有外部可见性,还是只是在这个编译单元中调用?如果该函数不具有外部可见性,则无需将其导出到符号表中,也不需要其他模块可以包含的原型(prototype)以便它们了解该函数。

在这种情况下,您可以声明函数 static,如 Martin 的回复:

static void myHandler(NSException * exception)
{
// ...
}

在这种情况下,static 告诉编译器如下内容:

Hey, compiler, create code for this function, and allow any code in this compilation unit to see the function, but do not give it external visibility. I don't want the function to be called by other modules.

在这种情况下,即使其他代码声明了原型(prototype),它们也看不到您的函数,因为它对于定义它的文件是“私有(private)的”。

由于它仅在本地文件中使用,因此不需要原型(prototype),因此无需警告您没有原型(prototype)。

现在,请注意...您不需要将 C 函数放在代码的@interface 和@implementation 部分,因为那样什么都不做。这些 C 函数在编译时具有完全相同的可见性和访问权限,无论它们是否在 ObjC 部分内。

最后,如果您愿意,可以在 Xcode build设置中禁用此警告(但既然您了解了警告的上下文,我建议保留它)。

关于iphone - 使用 NSSetUncaughtExceptionHandler 在 Objective C 中注册 UncaughtExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com