Objective c 如何在Xcode 6.3中检查Facebook帐户支持?
在我的Facebook模型类中,我有一个功能来检查用户的iOS是否支持Facebook帐户管理:Objective c 如何在Xcode 6.3中检查Facebook帐户支持?,objective-c,xcode,cocoa-touch,xcode6,Objective C,Xcode,Cocoa Touch,Xcode6,在我的Facebook模型类中,我有一个功能来检查用户的iOS是否支持Facebook帐户管理: + (BOOL)canUseExternalNetwork { return &ACAccountTypeIdentifierFacebook != nil; } 从Xcode 6.3开始,编译器会给出一个错误,说明: 地址ACAccountTypeIdentifierFacebook的比较不等于 空指针始终为真 首先,我不明白为什么旧iOS上的未定义常量会解析为大于0的地址。更重
+ (BOOL)canUseExternalNetwork
{
return &ACAccountTypeIdentifierFacebook != nil;
}
从Xcode 6.3开始,编译器会给出一个错误,说明:
地址ACAccountTypeIdentifierFacebook的比较不等于
空指针始终为真
首先,我不明白为什么旧iOS上的未定义常量会解析为大于0的地址。更重要的是,我想在没有黑客的情况下解决这个问题:
我不想更改编译器设置以关闭此警告。所有这一切将使我的代码运行,但不能正确运行。
我不想使用iOS版本检查。这样做可能会在将来Facebook不再受支持时中断。我认为Facebook已经停止在其新的Graph API 2.0中使用本机登录支持。新SDK不再使用操作系统提供的弹出窗口进行登录。相反,它跳转到Facebook应用程序。
一个适用于任何类型常数的通用解决方案会很好。虽然我现在只需要为Facebook和Twitter解决这个问题,但我还是想学习如何在将来处理类似的情况。
这具有编译器中一个轻微错误(也称为bug)的所有特征,当使用框架头中定义为弱链接的符号时,它没有正确评估-弱框架,因此认为代码是不可操作的
这意味着优化器能够很高兴地从代码中删除if检查——当我使用一个简单的代码测试段时,它确实做到了这一点
#import <Accounts/ACAccountType.h>
#import <stdio.h>
int
main(int argc, char **argv)
{
if (&ACAccountTypeIdentifierFacebook != NULL)
NSLog(@"Hello\n");
return (0);
}
检查时,显示代码中甚至未引用ACAccountTypeIdentifierFacebook符号:
$ nm -m a.out
(undefined) external _NSLog (from Foundation)
(undefined) external ___CFConstantStringClassReference (from CoreFoundation)
0000000100000000 (__TEXT,__text) [referenced dynamically] external __mh_execute_header
0000000100000f40 (__TEXT,__text) external _main
(undefined) external dyld_stub_binder (from libSystem)
i、 e.优化器将其完全移除。您可以使用otool-tva.out来检查生成的代码,您将看到完全跳过了if测试
希望它能在编译器的未来版本中得到修复,但是您可以暂时解决这个问题
<> >为了使编译器认为符号是弱的,它需要显式地标记为A,这意味着它需要看起来像:
extern NSString * const ACAccountTypeIdentifierFacebook __attribute__((weak_import));
这意味着代码看起来像:
if (&ACAccountTypeIdentifierFacebook != NULL) {
NSLog(@"Have Facebook");
}
然后将正常工作。如果我们在示例代码的开头添加一行这样的代码,并对其进行编译,我们会看到它编译时没有问题,并且符号出现在nm-ma.out的输出中,而If测试出现在otool-tv a.out的结果输出中
if (&ACAccountTypeIdentifierFacebook != NULL) {
NSLog(@"Have Facebook");
}