适用于iOS模拟器,但不适用于iPhone

这行代码在iOS模拟器6.0上工作正常,但是当我尝试在我的iPhone上运行它时,也运行iOS6时崩溃了。

[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没有包含在捆绑中。 将其添加到项目目标的“复制包资源”中,例如:

复制软件包资源

  • 在查看“Copy Bundle Resources”时,您还需要包含SDSubCell.xibSDGroupCell.xib ,并添加所有这些PNG文件。

  • SDNestedTableView一下,虽然它不会导致崩溃,但SDNestedTableView NIB中的“文件所有者”基类引用了在此项目中任何地方都不存在的类。 那不好。 无论如何,你可能想要改变SDMenuViewControllerSDNestedTableViewController ;

设置文件的所有者基类


这与你的崩溃有点无关,但是当我看着这个项目时,我看到一个令人担忧的结构:

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

你正在创build一个控制器,抓住它的视图,或者让视图控制器超出范围,并被释放(如果你正在使用ARC)或泄漏它(如果不是ARC)。

从最初的问题来看,我是不是完全肯定你是在做addSubview作为转换到新视图的方式(这实际上是一个很糟糕的做法),或者你是否在做视图控制器的控制。 当我看着代码,看起来你正在做后者,虽然你在代码中缺less一些调用。 您可能需要阅读视图控制器遏制 。 还可以看看WWDC 2011会议102 。

无论如何,上面这两行代码与视图控制器的alloc / init和随后的addSubview将泄漏您的非ARC项目(并会崩溃,如果你曾经到ARC),你的视图层次结构是不同步的视图控制器层次。 我build议你可能想要:

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

注意第一行的autorelease

视图控制器遏制可以是强大的,但你要确保你做这些基本的家务。


最后一次更新:

我注意到这个代码中有一些错误。 首先,您在item:setSubItem:forRowAtIndexPath使用currentSection不起作用。 你正在设置基于最后一个expandingItem 。 所以,如果你在扩展任何一个主要项目之前点击其中一个,程序将会崩溃。 最好的办法是消除currentSectionvariables,并在item:setSubItem:forRowAtIndexPath ,使用item.cellIndexPath.row而不是variablescurrentSection

不幸的是,这个修复导致了一个更严重的问题, SDNestedTable类本身似乎有一个iOS 6的bug。 如果你在iOS 6上运行这个,并展开你的所有项目,滚动到底部,然后回滚到顶部,程序将崩溃,因为item:setSubItem:forRowAtIndexPath返回的SDGroupItem *itemcellIndexPath属性可以是重新分配的! 如果你在iOS 6中打开僵尸,你会看到cellIndexPath已经被释放。 我去了,并下载了原来的版本 ,看到同样的问题。 问题似乎是SDGroupCell中的cellIndexPath被定义为一个assign属性(这意味着如果iOS确定它不再需要它为自己的目的而创build的indexPath ,即使SDGroupCell维护对这个发布的对象的assign引用,它也会被释放)。 只需SDGroupCellcellIndexPath属性从assign更改为retain ,这个iOS 6的bug就消失了。 我已经通知了SDNestedTable的开发者这个问题,但是这个retain改变将解决在iOS 6中代码崩溃的问题。

[编辑: SDNestedTable的作者同意我对这个问题的评估,他报告说这个问题已经修复了最新版本。 – Rob]

最好的祝愿。

你可能应该在第一行使用init initWithNibName: insead。 不确定关于你的具体问题,但肯定是要尝试的东西。

看起来你试图实例化一个称为SDNestedTableView.nib的nib,它不存在。 是否将笔尖作为项目成员?