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

Nei*_*eil 1 iphone xcode objective-c ios

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

[menuView addSubview:mvc.view];
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何解决?

这是代码的更完整版本:

SDMenuViewController *mvc = [[SDMenuViewController alloc] init];
[menuView addSubview:mvc.view];
Run Code Online (Sandbox Code Playgroud)

这就是它崩溃的原因:

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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rob*_*Rob 5

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

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

复制捆绑资源

  • 当你在看你的"复制包资源",你还需要包括SDSubCell.xib,SDGroupCell.xib,并添加所有的PNG文件,太多.

  • 顺便说一下,虽然它显然不会导致崩溃,但SDNestedTableViewNIB中的"文件所有者"基类是指在此项目中不存在的类.这不可能是好事.无论如何,你可能想要改变它SDMenuViewControllerSDNestedTableViewController;

设置文件的所有者基类


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

SDMenuViewController *mvc = [[SDMenuViewController alloc] initWithNibName:@"SDNestedTableView" bundle:nil];
[menuView addSubview:mvc.view];
Run Code Online (Sandbox Code Playgroud)

您正在创建一个控制器,抓取它的视图,并让视图控制器超出范围并被释放(如果您使用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];
Run Code Online (Sandbox Code Playgroud)

注意autorelease第一行.

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


最后一次更新:

我注意到此代码中存在一些错误.首先,你使用currentSectionin item:setSubItem:forRowAtIndexPath将不起作用.你是根据最后一个设置的expandingItem.因此,如果在展开任何一个主项之前单击其中一个主项,程序将崩溃.可能最好的方法是currentSection完全消除变量item:setSubItem:forRowAtIndexPath,使用item.cellIndexPath.row而不是变量currentSection.

不幸的是,这个修复导致了一个更严重的问题,类中似乎有一个iOS 6错误SDNestedTable本身.如果你在iOS 6上运行它并扩展你的所有项目,滚动到底部,然后滚动回到顶部,程序将崩溃,因为返回的cellIndexPath属性可以被释放!如果你打开iOS 6中的僵尸,你会看到已经发布.我去了下载原始版本并在那里看到同样的问题.问题似乎是in 被定义为一个属性(这意味着如果iOS确定不再需要它为自己的目的创建它,它将被释放,即使保持对此发布对象的引用).就在改变的属性从到,这个iOS 6中的bug消失.我已经告知开发人员这个问题,但是这个更改将解决iOS 6中代码崩溃的问题.SDGroupItem *itemitem:setSubItem:forRowAtIndexPathcellIndexPathcellIndexPathSDGroupCellassignindexPathSDGroupCellassigncellIndexPathSDGroupCellassignretainSDNestedTableretain

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

最好的祝愿.