Слабое соединение на 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.

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

19
задан Jonathan Grynspan 29 May 2011 в 15:52
поделиться

2 ответа

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

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

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

38
ответ дан 30 November 2019 в 03:07
поделиться

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

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

Он не работал бы без переменной ptr.

5
ответ дан 30 November 2019 в 03:07
поделиться