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

时间:2012-10-09 00:46:35

标签: iphone objective-c ios xcode

代码行在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

谢谢!

3 个答案:

答案 0 :(得分:5)

我不太确定它在你的模拟器上是如何工作的(当我在我的模拟器上尝试它时,我在原始问题中列出了崩溃)。无论如何,你可以通过查看以下项目来修复它:

  • 主要问题是NIB未包含在捆绑中。将它添加到项目目标的“Copy Bundle Resources”,例如:

Copy Bundle Resources

  • 当您查看“复制捆绑资源”时,您还需要包含SDSubCell.xibSDGroupCell.xib,并添加所有这些PNG文件。

  • 顺便说一句,虽然它显然不会导致崩溃,但SDNestedTableView NIB中的“文件所有者”基类是指在此项目中不存在的类。这不可能是好事。无论如何,您可能希望将其更改为SDMenuViewControllerSDNestedTableViewController;

Set File's Owner Base Class


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

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

您正在创建一个控制器,抓取其视图,并让视图控制器超出范围并被释放(如果您使用ARC)或泄漏它(如果不是ARC)。

从最初的问题我不完全确定你是否正在将addSubview作为转换到新视图的方式(这是一种非常糟糕的做法),或者你是否正在进行视图控制器控制。当我查看代码时,看起来你正在做后者,尽管你在代码中缺少一些调用。您可能希望阅读view controller containment。并查看WWDC 2011 session 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

查看控制器控制功能可能非常强大,但您希望确保执行一些基本的内务管理。


最后一次更新:

我注意到此代码中存在一些错误。首先,您在currentSection中使用item:setSubItem:forRowAtIndexPath将无效。您是根据上一个expandingItem设置的。因此,如果在展开任何一个主要项目之前单击其中一个主要项目,程序将崩溃。最好的方法是完全删除currentSection变量,并在item:setSubItem:forRowAtIndexPath中使用item.cellIndexPath.row而不是变量currentSection

不幸的是,此修复导致了更严重的问题,SDNestedTable类中似乎存在iOS 6错误。如果你在iOS 6上运行它并扩展你的所有项目,滚动到底部然后滚动回到顶部,程序将崩溃,因为cellIndexPath的{​​{1}}属性返回{ {1}}可以解除分配!如果你打开iOS 6中的僵尸,你会发现SDGroupItem *item已经发布。我去了original version并下载了同样的问题。问题似乎是item:setSubItem:forRowAtIndexPath中的cellIndexPath被定义为cellIndexPath属性(这意味着如果iOS确定它不再需要为自己的目的而创建的SDGroupCell ,即使assign维护对此发布对象的indexPath引用,它也会被释放。只需将SDGroupCell的{​​{1}}属性从assign更改为cellIndexPath,此iOS 6错误就会消失。我已经向开发人员通知了SDGroupCell此问题,但对assign的此更改将解决iOS 6中代码崩溃的问题。

[编辑:retain的作者同意我对此问题的评估,并且他报告此问题已修复最新版本。 - Rob]

祝福。

答案 1 :(得分:1)

您应该在第一行使用initWithNibName:而不只是init。不确定您的具体问题,但肯定要尝试。

答案 2 :(得分:0)

看起来你正在尝试实例化一个名为SDNestedTableView.nib的nib并且它不存在。笔尖是否包含在项目成员中?