我有一个主要针对3.0的iPhone应用程序,但是当它们可用时它会利用更新的API。代码是这样的:
if (UIApplicationDidEnterBackgroundNotification != NULL) {
[nc
addObserver: self
selector: @selector(irrelevantCallbackName:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
}
现在,根据Apple所说的一切,如果相关的API链接很弱,那么这将很好,因为动态链接器会将UIApplicationDidEnterBackgroundNotification
评估为NULL
。除了它没有。该应用程序会编译,但只要它if (UIApplicationDidEnterBackgroundNotification != NULL)
点击它就会EXC_BAD_ACCESS
崩溃。
这只是我需要设置的编译器标志的问题吗?或者我是以错误的方式解决这个问题?
答案 0 :(得分:38)
Aaand我想通了。对于非函数的符号(例如extern const int foobar
),您必须与符号的地址进行比较,而不是符号本身,因此:
if (&UIApplicationWillEnterForegroundNotification != NULL)
etc;
回想起来有点显而易见,但我仍然错过了我周围的整个宇宙,因为我从未提及过这种区别。
答案 1 :(得分:5)
以下是检查外部框架常量时我必须做的事情。
const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
return kCLLocationAccuracyBestForNavigation;
} else {
return kCLLocationAccuracyBest;
}
没有ptr变量就行不了。