Подтвердить что ты не робот

Слабая ссылка на 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.

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

4b9b3361

Ответ 1

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

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

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

Ответ 2

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

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

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