Слабая ссылка на iPhone отказывается работать

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

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

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

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

2 ответа

Решение

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

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

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

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

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

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

Другие вопросы по тегам