用于iPhone测试的通用iPhone/iPad应用程序调试编译错误

and*_*bee 30 iphone ipad ios ios-universal-app

我已经编写了一个iPhone和iPad通用应用程序,可以在Xcode上的iPad模拟器中正常运行,但我现在想测试iPhone的功能.我似乎无法使用此代码运行iPhone模拟器,因为它始终默认为iPad?

相反,我试图在设备上运行,当它开始运行时,我收到以下错误:

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
  Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST
Run Code Online (Sandbox Code Playgroud)

由于App是以编程方式而不是使用XIB构建的,因此我使用main.m方法中的以下行拆分了2个设备逻辑:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}
Run Code Online (Sandbox Code Playgroud)

从那时起,他们使用不同的AppDelegates,我已经检查了我的标题,以确保永远不会使用UISplitView,也不会通过Phone逻辑导入.

如何避免此错误,是否有更好的方法在这个以编程方式创建的应用程序中拆分通用逻辑路径?

Bra*_*son 66

由于您没有弱连接UIKit框架,因此触发了该错误.iPhone OS 3.2中的UIKit框架添加了UISplitViewController,如果你正常链接它,你的应用程序将假设这些符号存在于3.0,而不是.

要弱化链接框架,请在Xcode中找到您的应用程序目标,检查它,然后转到"常规"选项卡.该选项卡的底部应该是框架列表,其中包含Type列.将UIKit的类型从Required更改为Weak并重建您的应用程序.这应该处理运行时错误.

您的条件逻辑是合理的,但我倾向于共享一个应用程序委托,并进一步做特定于接口的布局.

(更新:12/21/2011)从iOS 4.2开始,您不再需要弱链接框架来防止这样的错误.正如Marco Arment所描述的,如果你使用iOS 4.2或更高版本构建并且目标是iPhone OS 3.1+,那么单个类现在是弱链接的,并且如果当前运行的操作系统版本上不存在该类,则应该+class返回它们的方法nil.

  • 在XCode 4.2中,这是目标 - >构建阶段 - >链接二进制与库 - >将框架从"必需"更改为"可选". (6认同)