У меня есть приложение для 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
.
Это - просто вопрос флага компилятора, который я должен установить? Или я иду об этом неправильным путем?
Аа, и я разобрался. Для символов, которые не являются функциями (например, extern const int foobar
), вы должны сравнивать с адресом символа, а не с самим символом, поэтому:
if (&UIApplicationWillEnterForegroundNotification != NULL)
etc;
Что в ретроспективе кажется очевидным , но я все еще виню всю вселенную вокруг меня за то, что она никогда не упоминает о различиях.
Вот что мне пришлось сделать при проверке внешней константы каркаса.
const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
return kCLLocationAccuracyBestForNavigation;
} else {
return kCLLocationAccuracyBest;
}
Он не работал бы без переменной ptr.