19

我有一个主要针对 3.0 的 iPhone 应用程序,但它在可用时利用了更新的 API。代码是这样的:

if (UIApplicationDidEnterBackgroundNotification != NULL) {
    [nc
        addObserver: self
        selector:    @selector(irrelevantCallbackName:)
        name:        UIApplicationDidEnterBackgroundNotification
        object:      nil];
}

现在,根据 Apple 曾经说过的所有内容,如果相关 API 链接较弱,那将正常工作,因为动态链接器将评估UIApplicationDidEnterBackgroundNotificationNULL. 除了它没有。应用程序可以编译,但一旦运行它if (UIApplicationDidEnterBackgroundNotification != NULL)就会崩溃EXC_BAD_ACCESS

这仅仅是我需要设置的编译器标志的问题吗?还是我以错误的方式解决这个问题?

4

2 回答 2

38

我想通了。对于不是函数的符号(extern const int foobar例如),您必须与符号的地址进行比较,而不是符号本身,因此:

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;

回想起来有点明显,但我仍然责怪我周围的整个宇宙从未提到过这种区别。

于 2010-06-09T02:59:56.123 回答
5

这是我在检查外部框架常量时必须做的事情。

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

如果没有 ptr 变量,它将无法工作。

于 2010-08-23T19:31:50.193 回答