Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在Xcode 6.3中检查Facebook帐户支持?_Objective C_Xcode_Cocoa Touch_Xcode6 - Fatal编程技术网

Objective c 如何在Xcode 6.3中检查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的地址。更重

在我的Facebook模型类中,我有一个功能来检查用户的iOS是否支持Facebook帐户管理:

+ (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");
}