针对iPhonetesting的通用iPhone / iPad应用程序debugging编译错误

我写了一个iPhone和iPad的通用应用程序,它可以在Xcode的iPad模拟器上正常运行,但我现在想testingiPhone的function。 我似乎无法运行这个代码的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 

由于应用程序是以编程方式构build的,而不是使用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"); } 

从这一点出发,他们使用不同的AppDelegates,我已经检查了我的头文件,以确保UISplitView永远不会被使用,也不会通过Phone逻辑导入。

我如何避免这个错误,是否有更好的方法来拆分这个程序创build的应用程序中的通用逻辑path?

该错误正在被触发,因为你并没有弱化UIKit框架。 iPhone OS 3.2中的UIKit框架添加了UISplitViewController,如果您正常链接它,则应用程序将假定这些符号存在于3.0,而不是它们所在的位置。

为了弱连接一个框架,在Xcode中find你的应用程序目标,检查它,然后进入常规选项卡。 在该选项卡的底部应该是一个框架列表,带有一个Type列。 将UIKit的types从“必需”更改为“弱”,然后重新生成应用程序。 这应该照顾运行时错误。

您的条件逻辑是正确的,但我倾向于共享一个应用程序委托,并进一步按照界面进行布局。

(更新:2011年12月21日)从iOS 4.2开始,您不再需要弱链接框架来防止这样的错误。 正如Marco Arment所描述的那样 ,如果使用iOS 4.2或更高版本构build目标并将其定向到iPhone OS 3.1以上,则单个类现在弱链接,并且如果类在当前正在运行的版本中不存在,应该使其+class方法返回nil OS。

我有一个非常类似的错误,这让我疯狂! :-)search小时,无法弄清楚…

就像你说的,在iPad Simulator中运行时一切正常,但是当试图用iPhone OS 3.1.2testingiPhone上的应用程序时,它甚至不会启动,而是会出现以下错误消息:

mi_cmd_stack_list_frames堆栈中没有足够的帧

通过检查几乎每一行代码,我意识到,像UIPopoverController或UISplitViewController(已经内部分叉iPad特定的代码)的3.2类的分配是造成这个问题。

所以,而不是:

infoPopover = [[UIPopoverController alloc] initWithContentViewController:infoNavController];

我会写

infoPopover = [[NSClassFromString(@“UIPopoverController”)alloc] initWithContentViewController:infoNavController];

这解决了我的问题! (如果错误消息不能让你知道错误发生的位置,debugging会非常困难…)

Xcode 8.3,iPad 2(非视网膜),Swift 3代码

帮助我的是:

  • 重新启动Xcode
  • 做一个'Product – > Clean'Shift Command K
  • 重build项目