Слабая ссылка на iPhone отказывается работать - PullRequest
19 голосов
/ 09 июня 2010

У меня есть приложение для 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 ]

38 голосов
/ 09 июня 2010

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

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

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

5 голосов
/ 23 августа 2010

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

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

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

...