我从我正在使用的库中获得了这段代码。
#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版本是否定义了这个常量,并且通过这样做,他试图检查是否应该运行中的指令?但是他已经有了ifdef __IPHONE_8_0
...(??!!)
我不明白。
无论如何,我正在为iOS 9.3进行编译,因此我可以删除if
和ifdef
,对吗?
这是检查弱链接符号是否可用。如果包含该符号的库/框架已弱链接且不可用,则其地址的计算结果将为NULL
,并且if
条件将为假。
有关完整详细信息,请参阅 Apple 使用基于 SDK 的开发中的使用弱链接的方法、函数和符号。
#ifdef __IPHONE_8_0
检查Xcode是否应该在里面编译代码。Ohterwise 旧版本的 Xcode 将显示有关未知变量SKStoreProductParameterAffiliateToken
的错误。
但是当使用较新的 Xcode 版本(使用 iOS SDK 8+(时,我们仍然可以为我们的项目设置较低的最低目标。在这种情况下,为了避免在低于iOS 8版本的设备上崩溃,我们应该首先检查是否存在变量,类,方法或函数。
在您的情况下,我们正在检查指向SKStoreProductParameterAffiliateToken
的指针是否未NULL
,这意味着应用程序当前至少在iOS 8上运行。