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