簡體   English   中英

適用於iOS模擬器,但不適用於iPhone

[英]Works on iOS Simulator but not on iPhone

該代碼行在iOS Simulator 6.0上工作正常,但是當我嘗試在同時運行iOS6的iPhone上運行該代碼時,該行崩潰了。

[menuView addSubview:mvc.view];

為什么會發生這種情況,我該如何解決?

這是代碼的更完整版本:

SDMenuViewController *mvc = [[SDMenuViewController alloc] init];
[menuView addSubview:mvc.view];

這就是它崩潰的原因:

2012-10-08 21:32:32.423 CrunchCalculator1-2[21019:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/EDD23933-CE20-4AFD-A2B1-CDD56AD658E8/CrunchCalculator1-2.app> (loaded)' with name 'SDNestedTableView''
*** First throw call stack:
(0x39cd03e7 0x35ece963 0x39cd0307 0x39ee0fd1 0x39ee05ff 0x39dd9031 0x39e0786d 0x39d63419 0xb20d9 0x39d63541 0x39da3d29 0x39d9fac5 0x39de1199 0xb17c5 0x39da4a71 0x39da45f5 0x39d9c803 0x39d44ce7 0x39d44775 0x39d441b7 0x31e145f7 0x31e14227 0x39ca53e7 0x39ca538b 0x39ca420f 0x39c1723d 0x39c170c9 0x39d9b43d 0x39d98289 0xb1523 0x3792fb20)
libc++abi.dylib: terminate called throwing an exception

謝謝!

我不太確定它在您的模擬器上是如何工作的(當我在我的模擬器上嘗試它時,我在最初的問題中列出了崩潰)。 無論如何,您可以通過查看以下各項進行修復:

  • 主要問題是NIB未包含在捆綁包中。 將其添加到項目目標的“副本捆綁資源”,例如:

復制捆綁包資源

  • 在查看“復制捆綁包資源”時,您還希望包含SDSubCell.xibSDGroupCell.xib ,並添加所有這些PNG文件。

  • SDNestedTableView ,雖然它顯然不會導致崩潰,但SDNestedTableView NIB中的“文件所有者”基類引用了該項目中任何地方都不存在的類。 那不是很好。 無論如何,您可能希望將其更改為SDMenuViewControllerSDNestedTableViewController

設置文件的所有者基本類


這與您的崩潰無關,但是當我查看該項目時,我看到了一個令人擔憂的構造:

SDMenuViewController *mvc = [[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil];
[menuView addSubview:mvc.view];

您正在創建一個控制器,獲取其視圖,然后讓視圖控制器超出范圍並被釋放(如果使用的是ARC)或泄漏它(如果不是ARC)。

從最初的問題中我不能完全確定您是否正在執行addSubview作為過渡到新視圖的方式(這確實是一種不好的做法),或者您是否正在執行視圖控制器包含。 當我查看代碼時,似乎正在執行后者,盡管您在代碼中遺漏了一些調用。 您可能想閱讀有關視圖控制器的內容 並查看WWDC 2011會議102

無論如何,上面帶有視圖控制器alloc / init和隨后的addSubview這兩行代碼將在您的非ARC項目中泄漏(並且如果您去過ARC則會崩潰),並且視圖層次結構與視圖不同步控制器層次結構。 我建議您可能要:

SDMenuViewController *mvc = [[[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil] autorelease];
[self addChildViewController:mvc];
[mvc didMoveToParentViewController:self];
[menuView addSubview:mvc.view];

注意第一行的autorelease發布。

View Controller遏制功能可能很強大,但是您要確保執行一些基本的內部管理。


最后更新:

我注意到這段代碼中有一些錯誤。 首先,您無法在item:setSubItem:forRowAtIndexPath使用currentSection 您要根據最后一個expandingItem 因此,如果在展開任一項目之前單擊其中一項,該程序將崩潰。 最好的方法是完全消除currentSection變量,並在item:setSubItem:forRowAtIndexPath中使用item.cellIndexPath.row而不是變量currentSection

不幸的是,此修復程序導致了一個更嚴重的問題, SDNestedTable類本身似乎存在一個iOS 6錯誤。 如果您在iOS 6上運行此程序,並展開所有項目,請滾動至底部,然后滾動至頂部,程序將崩潰,因為SDGroupItem *itemcellIndexPath屬性可以由item:setSubItem:forRowAtIndexPath返回釋放! 如果在iOS 6中打開僵屍,您將看到cellIndexPath已發布。 我去下載了原始版本,然后在那看到了同樣的問題。 問題似乎是SDGroupCell中的cellIndexPath被定義為一個assign屬性(這意味着,如果iOS確定不再需要它出於自身目的而創建的indexPath ,即使SDGroupCell維護對此釋放對象的assign引用,它也會被釋放。 )。 就在改變cellIndexPath財產SDGroupCellassignretain ,這iOS 6中的bug消失。 我已將此問題通知SDNestedTable的開發人員,但是retain此更改將解決iOS 6中代碼崩潰的問題。

[編輯: SDNestedTable的作者同意我對此問題的評估,並且他報告說此問題已修復為最新版本。 -Rob]

最好的祝願。

您可能應該在第一行中使用initWithNibName: init 不確定您的特定問題,但可以嘗試一下。

看來您要實例化一個名為SDNestedTableView.nib的筆尖,但該筆尖不存在。 筆尖是否包含在項目成員中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM