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链接很弱,那么它将正常工作,因为动态链接器将评估UIApplicationDidEnterBackgroundNotification
为NULL
.除了它没有.应用程序编译,但一旦它命中if (UIApplicationDidEnterBackgroundNotification != NULL)
它崩溃EXC_BAD_ACCESS
.
这只是我需要设置的编译器标志的问题吗?或者我是以错误的方式来做这件事的?
Jon*_*pan 38
Aaand我弄清楚了.对于非函数的符号(extern const int foobar
例如),您必须与符号的地址进行比较,而不是符号本身,因此:
if (&UIApplicationWillEnterForegroundNotification != NULL)
etc;
Run Code Online (Sandbox Code Playgroud)
回想起来有点显而易见,但我仍然错过了我周围的整个宇宙,因为没有提到这种区别.
这是检查外部框架常量时我必须做的事情.
const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
return kCLLocationAccuracyBestForNavigation;
} else {
return kCLLocationAccuracyBest;
}
Run Code Online (Sandbox Code Playgroud)
没有ptr变量就行不通.