如果存在C函数,在运行时检查的正确方法是什么?
This documentation page表示您应该使用if (MyWeakLinkedFunction != NULL)
进行检查,但this sample code表示您应该使用if (&UIApplicationOpenSettingsURLString == NULL) {
。
我目前需要SecAddSharedWebCredential
和UIApplicationOpenSettingsURLString
。
部署目标为iOS 7.0
时,对于第一个函数和第二个函数都不会发出警告,无论是否添加&
都不会发出警告。
部署目标为iOS 8.0
且两者都添加了&
,UIApplicationOpenSettingsURLString
会发出警告:
UIApplicationOpenSettingsURLString' UIApplicationOpenSettingsURLString'的地址比较不等于空指针始终为真
从两个功能检查中删除&
,SecAddSharedWebCredential
会发出警告:
功能比较' SecAddSharedWebCredential'不等于空指针始终为真
如果自iOS 8.0以来两者都可用,为什么不发出相同的警告?什么是检查这个的正确方法,忽略警告?
答案 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。