Question

J'ai une application iPhone qui est principalement 3.0 ciblage, mais qui profite des nouvelles API quand ils sont disponibles. Code va quelque chose comme ceci:

if (UIApplicationDidEnterBackgroundNotification != NULL) {
    [nc
        addObserver: self
        selector:    @selector(irrelevantCallbackName:)
        name:        UIApplicationDidEnterBackgroundNotification
        object:      nil];
}

, selon tout ce que Apple n'a jamais dit, si les API pertinentes sont faiblement liées, qui fonctionnera bien parce que l'éditeur de liens dynamique évaluera UIApplicationDidEnterBackgroundNotification à NULL. Sauf que ce ne est pas. L'application compile, mais dès qu'il frappe if (UIApplicationDidEnterBackgroundNotification != NULL) il se bloque avec EXC_BAD_ACCESS.

Est-ce simplement une question d'un drapeau du compilateur que je dois mettre? Ou vais-je sur ce dans le mauvais sens?

Était-ce utile?

La solution

aaand I figured it out. Pour les symboles qui ne sont pas des fonctions (extern const int foobar, par exemple), vous devez comparer à l'adresse du symbole, pas le symbole lui-même, donc:

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

Ce qui, rétrospectivement, est un peu évident, mais je reste rien à redire autour de moi l'univers entier pour ne pas mentionner jamais la distinction.

Autres conseils

Voici ce que je devais faire lors de la vérification d'une constante de cadre extérieur.

const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
    return kCLLocationAccuracyBestForNavigation;
} else {
    return kCLLocationAccuracyBest;
}

Il ne fonctionnerait pas sans la variable ptr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top