Вопрос

У меня есть приложение для iPhone, которое в основном ориентировано на 3,0, но использует новые API, когда они доступны. Код идет что-то вроде этого:

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

Теперь, согласно все, что когда-либо говорилось, что яблоко, если соответствующие API слабо связаны, это будет работать нормально, потому что динамический линкер оценивает UIApplicationDidEnterBackgroundNotification к NULL. Отказ За исключением того, что это не так. Приложение компилирует, но как только оно попадает if (UIApplicationDidEnterBackgroundNotification != NULL) Сбивает с собой EXC_BAD_ACCESS.

Это просто вопрос компилятора, который мне нужно установить? Или я собираюсь по этому неправильному способу?

Это было полезно?

Решение

Ааан я понял это. Для символов, которые не являются функциями (extern const int foobar, Например,), вы должны сравнить с адресом символа, а не сам символ, поэтому:

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

Что в ретроспективе довольно очевидно, но я все еще виновал всю вселенную вокруг меня, потому что никогда не упоминал различие.

Другие советы

Вот что мне пришлось сделать при проверке постоянной внешней структуры.

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

Это не будет работать без переменной PTR.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top