2017-11-11 114 views
3

我从我正在使用的库中获取该代码。通过检查像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是说第一行总是会被评估为true,但是这条线究竟是做什么的?我从来没有看到一个if&,并以这种方式常数。

SKStoreProductParameterAffiliateToken被定义为

SK_EXTERN NSString * const SKStoreProductParameterAffiliateToken NS_AVAILABLE_IOS(8_0); 

什么是开发尝试检查,恒定的地址?他是否试图检查iOS的版本是否具有此常量定义,并且通过这样做,他试图检查if中是否应该运行?但他已经有ifdef __IPHONE_8_0 ...(?? !!)

我不明白这一点。

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

+0

至少运行'SKStoreProductParameterAffiliateToken'在IOS 8.0加入。如果你不需要支持iOS 7,那么你可以删除'#ifdef'和'if'。 – rmaddy

回答

3

这是一个检查,看是否有弱链接符号是可用的。如果包含该符号的库/框架已被弱连接并且不可用,则其地址将评估为NULL并且if条件将是错误的。

请参阅使用Apple的Using SDK-Based Development中的弱连接方法,函数和符号了解完整详细信息。

0

#ifdef __IPHONE_8_0检查的Xcode里面应该编译代码。较旧版本的Xcode将显示有关未知变量SKStoreProductParameterAffiliateToken的错误。

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

在你的情况,我们正在检查,如果指针SKStoreProductParameterAffiliateTokenNULL,这意味着应用程序是目前在iOS 8

相关问题