Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I have this code from a library I am using.

#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 is saying that the first line will always evaluate to be true but what is this line doing exactly? I never saw a if with & and a constant in that way.

SKStoreProductParameterAffiliateToken is defined as

SK_EXTERN NSString * const SKStoreProductParameterAffiliateToken NS_AVAILABLE_IOS(8_0);

What is the developer trying to check, the address of a constant? Is he trying to check if the version of iOS has this constant defined and by doing that, he is trying to check the instruction inside the if should run? But he already has ifdef __IPHONE_8_0... (??!!)

I don't get it.

Anyway I am compiling for iOS 9.3, so I can delete the if and the ifdef, right?

like image 395
Phox Avatar asked Dec 21 '25 10:12

Phox


1 Answers

It is a check to see if a weak-linked symbol is available. If the library/framework containing the symbol has been weakly linked and is not available its address will evaluate to NULL and the if condition will be false.

See Using Weakly Linked Methods, Functions, and Symbols in Apple's Using SDK-Based Development for full details.

like image 57
CRD Avatar answered Dec 23 '25 23:12

CRD



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!