在Objective-C中正确检查C函数的存在

时间:2017-03-03 10:30:09

标签: ios c

如果存在C函数,在运行时检查的正确方法是什么?

This documentation page表示您应该使用if (MyWeakLinkedFunction != NULL)进行检查,但this sample code表示您应该使用if (&UIApplicationOpenSettingsURLString == NULL) {

我目前需要SecAddSharedWebCredentialUIApplicationOpenSettingsURLString

部署目标为iOS 7.0时,对于第一个函数和第二个函数都不会发出警告,无论是否添加&都不会发出警告。

部署目标为iOS 8.0且两者都添加了&UIApplicationOpenSettingsURLString会发出警告:

  

UIApplicationOpenSettingsURLString' UIApplicationOpenSettingsURLString'的地址比较不等于空指针始终为真

从两个功能检查中删除&SecAddSharedWebCredential会发出警告:

  

功能比较' SecAddSharedWebCredential'不等于空指针始终为真

如果自iOS 8.0以来两者都可用,为什么不发出相同的警告?什么是检查这个的正确方法,忽略警告?

2 个答案:

答案 0 :(得分:1)

对于功能,&是可选的。对于其他类型,例如字典键,这是必要的。

这是因为在表达式中使用函数符号会自动转换为指向函数的指针。尝试阅读问题Function pointers and address of a function的答案。

也许一个例子可以说明这一点:

extern int functionA(void);
extern NSString * const valueA;

// ...
printf("%p <-  functionA\n", functionA);
printf("%p <- &functionA\n", &functionA);
printf("%p <-  valueA\n", valueA);
printf("%p <- &valueA\n", &valueA);

将输出类似于:

的内容
0x1089a8f00 <-  functionA
0x1089a8f00 <- &functionA
0x1089a9018 <-  valueA
0x1089a9040 <- &valueA

如果valueA在运行时不可用,第三行将崩溃。

答案 1 :(得分:0)

只有当部署目标小于8.0时才需要检查NULL,否则它不是NULL - 这就是警告的状态。这两个都是在iOS 8.0中添加的,因此如果您的部署目标是iOS 8.0及更高版本,则无需检查NULL。