iPhone上的弱链接拒绝工作

时间:2010-06-09 02:53:49

标签: iphone objective-c weak-linking

我有一个主要针对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崩溃。

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

2 个答案:

答案 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变量就行不了。