[英]Universal iPhone/iPad application debug compilation error for iPhone testing
我已經編寫了一個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
由於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");
}
從那時起,他們使用不同的AppDelegates,我已經檢查了我的標題,以確保永遠不會使用UISplitView,也不會通過Phone邏輯導入。
如何避免此錯誤,是否有更好的方法在這個以編程方式創建的應用程序中拆分通用邏輯路徑?
由於您沒有弱連接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
。 OS。
我有一個非常類似的錯誤,它讓我瘋了! :-)搜索幾個小時,無法弄明白......
就像你說的那樣,在iPad模擬器中運行時一切都很好,但是當試圖用iPhone OS 3.1.2在iPhone上測試應用程序時,它甚至不會啟動,但會因以下錯誤消息而崩潰:
mi_cmd_stack_list_frames堆棧中沒有足夠的幀
通過檢查幾乎每行代碼我意識到分配3.2類如UIPopoverController或UISplitViewController(已經在分叉的iPad特定代碼中)導致了問題。
所以而不是ie:
infoPopover = [[UIPopoverController alloc] initWithContentViewController:infoNavController];
我會寫的
infoPopover = [[NSClassFromString(@“UIPopoverController”)alloc] initWithContentViewController:infoNavController];
這解決了我的問題! (如果錯誤消息沒有告訴您可能找到錯誤的位置,調試可能會很難...)
對我有幫助的是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.