Слабая ссылка на iPhone отказывается работать
-
25-09-2019 - |
Вопрос
У меня есть приложение для 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.