iPhone上的弱链接拒绝工作

Jon*_*pan 19 iphone objective-c weak-linking

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

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

现在,根据Apple所说的一切,如果相关的API链接很弱,那么它将正常工作,因为动态链接器将评估UIApplicationDidEnterBackgroundNotificationNULL.除了它没有.应用程序编译,但一旦它命中if (UIApplicationDidEnterBackgroundNotification != NULL)它崩溃EXC_BAD_ACCESS.

这只是我需要设置的编译器标志的问题吗?或者我是以错误的方式来做这件事的?

Jon*_*pan 38

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

if (&UIApplicationWillEnterForegroundNotification != NULL)
    etc;
Run Code Online (Sandbox Code Playgroud)

回想起来有点显而易见,但我仍然错过了我周围的整个宇宙,因为没有提到这种区别.

  • 如果您正在使用LLVM,则必须采取一些技巧来使其不显示您的if语句.这适合我.BOOL backgroundOK =&UIApplicationDidEnterBackgroundNotification!= NULL; if(backgroundOK){[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground :) name:UIApplicationDidEnterBackgroundNotification bject:nil]; } (2认同)

And*_*ael 5

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

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

没有ptr变量就行不通.