繁体   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