2012-04-01 54 views
4

嘗試使用Xcode 4.3.2構建和調試iOS 3.0的通用應用程序。我從NSKeyedUnarchiver得到一個NSException。看起來它可能與無法讀取主.xib文件有關。我已經看到了這個:iOS and unarchiving xib files - 然而,在這種情況下,它並不清楚該應用程序是通用的(他們的解決方案不起作用)(注意:他們的解決方案不起作用,因爲他們使用的是Xcode 4.2,而不是4.3)。使用Xcode 4.3.x爲iOS 3.0構建通用應用程序 - NSKeyedUnarchiver異常

這裏的錯誤輸出:

2000-01-01 11:00:39.-19 myApp[664:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)' 
2000-01-01 11:00:39.-01 myApp[664:207] Stack: (
     808001701, 
     805397928, 
     807551015, 
     807550919, 
     810902709, 
     815043196, 
     815042704, 
     814682908, 
     814682012, 
     814970032, 
     814968048, 
     814966908, 
     839149932, 
     807750263, 
     807747947, 
     814678868, 
     814672532, 
     12253, 
     12124 
    ) 
    terminate called after throwing an instance of 'NSException' 
    Not safe to look up objc runtime data. 
+0

所以,爲了清楚起見,您已將所有XIB文件設置爲該答案中指定的設置? – borrrden 2012-04-01 05:02:44

+0

我不知道你是否有 - 但我確實爲每個文件都設置了部署和開發到3.0。我也嘗試過將iPad .xibs設置爲3.2。無論如何,我在iOS 3.0上進行調試時遇到以上錯誤。 – windup 2012-04-01 05:27:13

+0

3.2仍然大於3.0。如果這是最低的,那麼你可能不得不考慮將XCode降級到4.2.1,以便能夠匹配該答案中顯示的設置。如果你不想降級,那麼你不得不考慮提高你的最低iOS版本,我想。 – borrrden 2012-04-01 06:36:53

回答

0

我想我得到了它。之前的iOS 3.2不支持格式的廈門國際銀行,所以你需要先將其轉換到老NIB格式,在這個答案:Loading main XIB makes app crash on iOS 3.0

下面是文章的問題是指iOS 3.2 SDK Release Notes

+0

我查看了名爲「Interface Builder」的發行說明部分。它指出了兩個構建設置「Flatten ..」和「Strip」。在Xcode 4.3中,我看到了Flatten設置,但這已經是肯定的了。我沒有看到Strip設置,但會假設它是否在那裏,因爲我沒有使用任何本地化。我錯過了什麼嗎? – windup 2012-04-02 01:23:06

+0

你不想扁平它,這是問題:D。 – borrrden 2012-04-02 01:29:33

+0

我讀過它的方式是讓xib不被打開並且沒有被去除的能力在3.2中是新的,但是默認情況下就像在3.2之前完成的那樣平整和去除。無論如何,我嘗試將Flatten選項設置爲NO,而不是上述錯誤,我得到:無法加載NSMainNibFile MainWindow_Phone。 – windup 2012-04-02 02:01:46

0

檢查出這個鏈接:

SOLUTION-1:

iOS and unarchiving xib files

SK9的回答上面的鏈接,主要內容如下:

這個答案,我相信包括什麼Ikuragames有可能給(他 附近沒有他的電腦)。以他的名義,爲解決Xcode中的問題 4.2.1點擊.xib文件並在右側的文件屬性面板中,將部署設置爲「iOS 3.0」(在我的情況下)和 開發爲「界面生成器3.0「(再次在我的情況)。爲項目中的每個.xib文件執行 。

值得一提的是,Xcode 4.2.1可能會爲此部署設置默認值 「iOS 5.0」,以匹配當前SDK,併爲文檔類型設置 「Xcode 4.1」。爲什麼Xcode的不只是搭配的項目部署的目標,我不知道 部署目標......

如果這仍然不起作用,或者你很偏執到了這個階段, 捕獲引發的異常由NSKeyedUnarchiver加載 .xib文件時,在那裏以編程方式創建視圖。

enter image description here

SOLUTION-2:

Not safe to lookup objc runtime data

BadPirate的答案在上面的鏈接,這是如下:

可能是這就是了 一個malloc進入並行線程。檢查 出這個傢伙的解決方案:http://www.fatcatsoftware.com/blog/2010/04

SOLUTION-3:

iPhone Simulator chrashes in NSKeyedUnarchiver after setting base SDK

弗洛裏安的答案在上面的鏈接,主要內容如下:

我解決了這個詳細的堆棧跟蹤問題:

#0 0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ 
#1 0x904a3509 in objc_exception_throw 
#2 0x3028e5fb in +[NSException raise:format:arguments:] 
#3 0x3028e55a in +[NSException raise:format:] 
#4 0x30513b77 in -[NSKeyedUnarchiver initForReadingWithData:] 
#5 0x30ab4b2a in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] 
#6 0x30ab6eb3 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] 
#7 0x308f85f1 in -[UIApplication _loadMainNibFile] 
#8 0x30901a15 in -[UIApplication _runWithURL:sourceBundleID:] 
#9 0x308fef33 in -[UIApplication handleEvent:withNewEvent:] 
#10 0x308fad82 in -[UIApplication sendEvent:] 
#11 0x309013e1 in _UIApplicationHandleEvent 
#12 0x32046375 in PurpleEventCallback 
#13 0x30245560 in CFRunLoopRunSpecific 
#14 0x30244628 in CFRunLoopRunInMode 
#15 0x308f930d in -[UIApplication _run] 
#16 0x309021ee in UIApplicationMain 
#17 0x0000255c in main at main.m:14 

該應用程序在調用mainNibFile時崩潰。我不知道爲什麼,但只需重新保存MainWindow.xib即可解決問題。

讓我知道你是否需要更多的幫助。

此解決方案應該對您有所幫助。

+0

我已經發布了鏈接,並從鏈接中複製了已接受的答案,只是爲了確保我的答案不會因爲某些原因而變爲無用鏈接。我通過在** bold **中添加他們的名字而賦予了原始海報的功勞。 – 2012-04-01 17:09:35

+0

Parth,感謝您對此進行調查。第一個鏈接與我在我的問題中提到的是同一個鏈接。我也看到了最後一個,但後來在評論者的評論中撤回了他的說法,即它的工作原理。無論如何,我確實嘗試加載並重新保存,但沒有任何幫助。你能否讓Xcode 4.3在iOS3.0上運行應用程序? – windup 2012-04-02 06:28:30

+0

@windup:在我的第一個** SOLUTION-1 **中,您需要將'Deployment'從界面構建器更改爲iOS 3.2'。我認爲這應該對你有所幫助。 – 2012-04-02 07:06:27

3

只是想我會分享我的解決方案這個NSKeyedUnarchiver難以理解的歸檔xib錯誤。

我剛剛花了兩週的時間把我的頭髮拉出來,我的解決方法與上面的borrrden's非常相似(即使用使用舊版Xcode構建的nib文件)。我嘗試了所有我能想到的,沒有任何歡樂的事情。 (我的其他選擇是停止使用xib文件,並在代碼中編寫整個用戶界面或停止支持iOS 3.0)

所以,這是我的情況,我是如何得到解決方法的工作以及我如何構建分佈存檔爲應用商店。

首先是一點背景:我的應用程序最初是用Xcode 3.2.5構建的,並且在iOS 3.0及更高版本上運行良好。當我升級到Xcode 4.2時,只要應用程序加載了xib文件,就會收到NSKeyedUnarchiver錯誤。經過一番Google搜索後,我發現了這個主題中提到的其他文章,所以我更改了每個xib文件的部署和開發版本。這工作了一種享受,直到我錯誤返回時升級到Xcode 4.3.1。我重新檢查了所有的xib文件,但沒有喜悅。即使它們設置爲iOS3.0/IB3.0(並且我嘗試了所有可用的組合),該應用程序仍然崩潰。

爲了證明這是xib文件的問題,我嘗試在設備上調試(運行iOS 3.0的第二代iPod Touch,通過電纜連接到Xcode)。但是在調試器開始之前,應用程序會崩潰。所以我從項目中移除了MainWindow.xib(在代碼中設置了App Delegate和UIWindow)。這允許調試器開始並打到我的第一個斷點(第一行應用程序:didFinishLaunchingWithOptions),但是應用程序只會在我推送ViewController時不會拋出異常而掛起。經過大量挖掘,我將調試器從LLDB切換到GDB(從產品 - >編輯方案)。這阻止了應用程序掛起,並拋出異常,因爲我認爲它應該(難以理解的存檔之一)。 LLDB顯然仍然存在問題。

經過幾個星期拉出我的頭髮的唯一工作是使用舊版Xcode構建的筆尖文件。幸運的是我的Xcode 3.2.5坐在我的機器上。以下是我用來實現此功能的步驟,並允許爲應用商店構建存檔:

  • 退出Xcode 4.3.1並啓動Xcode 3.2.5。
  • 創建一個新的基於View-Based-Application的項目,並將主項目中的所有.xib文件添加到該項目中。
  • 設置部署目標到iOS3.0然後做一個發佈版本和設備上運行(使用通用的供應配置文件,如果它不挑這件事自動)
  • 從Xcode中,在Finder中顯示的。應用程序,然後顯示Package Contents查看其中的所有.nib文件(Xcode已將.xib文件轉換爲.nib文件)。
  • 爲了便於使用,請將.nib文件複製到另一個目錄。
  • 退出Xcode 3.2.5並啓動Xcode 4.3.1並打開您的項目。
  • 訪問每個xib並從右側邊欄取消選擇您的應用程序從目標成員(這意味着Xcode將而不是使用這些.xib文件的最終包)。
  • 現在將所有新的.nib文件(由Xcode 3.2.5生成)添加到您的項目中(爲了整潔,將它們放在一個自己的組中)。
  • 現在,您可以隨心所欲地清理,構建和運行,甚至爲應用商店構建歸檔文件。

要證明正在使用正確的.nib文件,請使用終端中的md5。在Finder中顯示您的.app(或從管理器歸檔)以查看Xcode創建它的位置,然後顯示包內容以查看.nib文件。將md5校驗和與Xcode 3.2.5創建的.nib文件進行比較。

只要記住,任何時候你修改一個xib它不會被使用,直到你從Xcode 3.2.5構建。並將生成的.nib文件複製到您的保存目錄。

這並不理想,如果任何人有更好的解決方案,我會很樂意聽到它。在此期間,我希望這有助於。

+0

謝謝,希望我上週看到這個。我嘗試了我在3.1.2+上的工作原理,結果把我的目標設定爲3.1。實際上我會嘗試類似於你寫的東西,但是我的舊Xcode不會在Lion上運行,所以我放棄了。你有沒有在Lion上運行Xcode 3.2.5的問題? – windup 2012-04-10 00:03:43

+0

Lion上的Xcode 3.2.5對我來說工作得很好,但是你僅限於iOS4 SDK,否則我會堅持下去。我也曾經在某一點上走過你的路線,但我在將iOS 3.1.2加載到設備上時遇到了問題,所以我放棄了。你知道蘋果是否有這些舊的固件可供下載? – AW101 2012-04-10 20:25:30

+0

讓3.1.2變得很痛苦 - 發佈一個新問題,我會回答,所以我可以關閉它。在這裏粘貼鏈接作爲評論。 – windup 2012-04-12 20:03:24

相關問題