iPhone在通用应用程序中检查运行时的常量

jos*_*hue 5 iphone universal ipad

我正在制作一个通用的iPad/iPhone应用程序,可以使用iPad的VGA输出连接器在外部屏幕上镜像应用程序的内容.但是,iPhone没有此功能.给出以下代码,

#ifdef UI_USER_INTERFACE_IDIOM  
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    NSLog(@"this code should not execute on iphone");
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidConnectNotification
           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
         selector:@selector(screenInfoNotificationReceieved:) 
          name:UIScreenDidDisconnectNotification
           object:nil];
}
#endif
Run Code Online (Sandbox Code Playgroud)

我在启动时在手机上收到此错误(在ipad中正常工作)"dyld:找不到符号:_UIScreenDidConnectNotification"

大概是因为UIScreenDidConnectNotification在3.13中还没有存在.如何在运行时检查?

UPDATED 添加了ifdef语句来检查ipad接口,但获得了相同的结果!

UPDATED添加了NSLog语句,以确保不调用if语句中的代码.崩溃似乎发生在任何其他代码执行之前...

Hwe*_*Yar 3

尝试弱链接 UIKit。添加到您的其他链接标志中:

-all_load -ObjC -weak_framework UIKit

如果您的目标是 3.1 之前的设备,但引用仅存在于 3.2 中的类,则不能通过符号引用它们,必须使用 NSClassFromString。但在某些情况下这是不可能的,例如,如果您对这样的类进行子类化(例如 UIPopoverController)。在这些情况下,你必须弱链接 UIKit。当您弱链接框架时,动态加载器会尝试在启动时解析所有符号,如果失败,则将其设置为 NULL。

我猜测常量 UIScreenDidConnectNotification 未标记(错误),因此您需要使用相同的解决方法。

弱链接有一个缺点。由于它必须在启动时动态地执行此操作,因此启动时间会受到影响。您必须测试它是否对您来说太慢。

弱链接框架的另一种方法是:在目标上执行“获取信息”,然后在“常规”选项卡下,您将看到框架列表。将 UIKit 的类型更改为 Weak。

顺便说一句,使用 #ifdef 进行检查不起作用,因为 #ifdef 是编译时构造,因此 UI_USER_INTERFACE_IDIOM 将始终被定义,因为您正在使用 3.2 SDK 进行构建