该代码行在 iOS Simulator 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
谢谢!
最佳答案
我不太确定它在您的模拟器上是如何工作的(当我在我的模拟器上尝试时,我得到了您在原始问题中列出的崩溃)。无论如何,您可以通过查看以下项目来修复它:
SDSubCell.xib
, SDGroupCell.xib
, 并添加所有这些 PNG 文件。 SDNestedTableView
中的“文件所有者”基类NIB 指的是这个项目中任何地方都不存在的类。那可不好。无论如何,您可能想将其更改为 SDMenuViewController
或 SDNestedTableViewController
; 这与您的崩溃有点无关,但是当我查看该项目时,我看到了一个令人担忧的结构:
SDMenuViewController *mvc = [[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil];
[menuView addSubview:mvc.view];
您正在创建一个 Controller ,获取其 View ,然后让 View Controller 超出范围并被释放(如果您使用的是 ARC)或泄漏它(如果不是 ARC)。
从最初的问题中我不能完全确定你是否在做
addSubview
作为过渡到新 View 的一种方式(这确实是一种不好的做法),或者您是否正在执行 View Controller 遏制。当我查看代码时,您似乎正在执行后者,尽管您的代码中缺少一些调用。您可能想阅读 view controller containment .并查看 WWDC 2011 session 102 .无论如何,上面那两行代码与 View Controller
alloc
/init
和随后的 addSubview
将在您的非 ARC 项目中泄漏(如果您曾经使用 ARC,它会崩溃)并且您的 View 层次结构与您的 View Controller 层次结构不同步。我建议你可能想要:SDMenuViewController *mvc = [[[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil] autorelease];
[self addChildViewController:mvc];
[mvc didMoveToParentViewController:self];
[menuView addSubview:mvc.view];
注意
autorelease
在第一行。View Controller 包含功能可能很强大,但您要确保完成一些基本的内务处理。
最后一次更新:
我注意到这段代码中有一些错误。一、您使用
currentSection
在 item:setSubItem:forRowAtIndexPath
不会工作。您正在根据最后一个 expandingItem
进行设置.因此,如果您在展开任一主要项目之前单击其中一项,程序将崩溃。可能最好的方法是消除 currentSection
完全可变并且在 item:setSubItem:forRowAtIndexPath
, 使用 item.cellIndexPath.row
而不是你的变量currentSection
.不幸的是,此修复导致了更严重的问题,
SDNestedTable
中似乎存在 iOS 6 错误。类,本身。如果您在 iOS 6 上运行此程序并展开所有项目,滚动到底部然后滚动回顶部,程序将崩溃,因为 cellIndexPath
SDGroupItem *item
的属性(property)由 item:setSubItem:forRowAtIndexPath
返回可以解除分配!如果你在 iOS 6 中打开僵尸,你会看到 cellIndexPath
已被释放。我去下载了original version并在那里看到同样的问题。问题似乎是 cellIndexPath
在 SDGroupCell
定义为 assign
属性(这意味着如果 iOS 确定它不再需要它为自己的目的创建的 indexPath
,它将被释放,即使 SDGroupCell
维护对这个释放对象的 assign
引用)。只需更改 cellIndexPath
SDGroupCell
的属性(property)来自 assign
至retain
,并且这个 iOS 6 错误消失了。我已通知开发者 SDNestedTable
此问题,但此更改为 retain
将修复代码在 iOS 6 中崩溃的问题。[编辑:
SDNestedTable
的作者同意我对该问题的评估,并且他报告说此问题已在最新版本中修复。 - 抢]最良好的祝愿。
关于iphone - 适用于 iOS 模拟器但不适用于 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791411/