加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – 使用NSSetUncaughtExceptionHandler在Objective C中注

发布时间:2020-12-14 19:31:42 所属栏目:百科 来源:网络整理
导读:我使用UncaughtExceptionHandler注册未捕获的异常处理程序的代码如下,您认为会有任何潜在的问题吗? @interface AppDelegate ()void myHandler(NSException * exception);@end@implementation AppDelegatevoid myHandler(NSException * exception){ // ...}-
我使用UncaughtExceptionHandler注册未捕获的异常处理程序的代码如下,您认为会有任何潜在的问题吗?

@interface AppDelegate ()

void myHandler(NSException * exception);

@end

@implementation AppDelegate

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

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

是否有可能以更简洁的方式编写它?

我需要使用类扩展来声明原型,以便摆脱以前没有函数原型的警告.

解决方法

马丁的回答是正确的.但是,我想我会详细说明一下,解释为什么会如此.

你的功能定义:

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

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

但是,因为它应该是外部可见的,所以其他文件必须知道该函数是什么样的.这就是原型发挥作用的地方.警告基本上是说……

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.

所以,你得到一个警告.这是一个很好的警告.它可以帮助您记住为要导出的函数声明原型.

现在,正如您所发现的那样,您可以声明原型,并且警告消失了.但是,在实现文件中声明原型应该是另一个警告.个人警告应该是:

您真的希望此函数具有外部可见性,还是仅在此编译单元中调用?如果该函数不具有外部可见性,则无需将其导出到符号表中,并且不需要其他模块可以包含的原型,因此他们知道该函数.

在这种情况下,您可以在Martin的响应中声明函数static:

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.

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

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

现在,就像一个注释……你不需要将C函数放在代码的@interface和@implementation部分,因为它什么都不做.无论它们是否在ObjC部分内,这些C函数都具有完全相同的可见性和访问权限.

最后,如果您愿意,可以在Xcode构建设置中禁用此警告(但现在您已了解警告的上下文,我建议将其保留).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读