通过检查像 SKStoreProductParameterAffiliateToken 这样的常量的地址来完成什么?

What is accomplished by checking the address of a constant like SKStoreProductParameterAffiliateToken?

我从我正在使用的库中获得了这段代码。

#ifdef __IPHONE_8_0
    if (&SKStoreProductParameterAffiliateToken) {
        if (self.affiliateToken) {
            [appParameters setObject:self.affiliateToken forKey:SKStoreProductParameterAffiliateToken];
            if (self.campaignToken) {
                [appParameters setObject:self.campaignToken forKey:SKStoreProductParameterCampaignToken];
            }
        }
    }
#endif

Xcode 是说第一行的计算结果总是为真,但这一行到底在做什么?我从未见过 if& 以及那样的常量。

SKStoreProductParameterAffiliateToken 定义为

SK_EXTERN NSString * const SKStoreProductParameterAffiliateToken NS_AVAILABLE_IOS(8_0);

开发人员要检查什么,常量的地址?他是否试图检查 iOS 的版本是否定义了这个常量,通过这样做,他试图检查 if should 运行 中的指令?但是他已经ifdef __IPHONE_8_0... (??!!)

我不明白。

无论如何我正在为 iOS 9.3 编译,所以我可以删除 ififdef,对吗?

检查弱链接符号是否可用。如果包含该符号的 library/framework 已被弱链接且不可用,其地址将计算为 NULL,并且 if 条件将为假。

有关完整详细信息,请参阅 Apple Using SDK-Based Development 中的 使用弱链接方法、函数和符号

#ifdef __IPHONE_8_0 检查 Xcode 是否应该在里面编译代码。 Ohterwise 旧版本 Xcode 将显示关于未知变量 SKStoreProductParameterAffiliateToken.

的错误

但是当使用较新的 Xcode 版本(使用 iOS SDK 8+)时,我们仍然可以为我们的项目设置一个较低的最低目标。在这种情况下,为了避免在低于 iOS 8 版本的设备上崩溃,我们应该首先检查变量、class、方法或函数是否存在。

在您的情况下,我们正在检查指向 SKStoreProductParameterAffiliateToken 的指针是否不是 NULL,这意味着应用程序当前 运行 至少在 iOS 8.