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

标签 iphone objective-c ios xcode

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

谢谢!

最佳答案

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

  • 主要问题是 NIB 未包含在捆绑包中。将其添加到项目目标的“复制捆绑资源”中,例如:

  • Copy Bundle Resources
  • 在查看“复制捆绑资源”时,您还需要包含 SDSubCell.xib , SDGroupCell.xib , 并添加所有这些 PNG 文件。
  • 顺便说一句,虽然它显然不会导致崩溃,但 SDNestedTableView 中的“文件所有者”基类NIB 指的是这个项目中任何地方都不存在的类。那可不好。无论如何,您可能想将其更改为 SDMenuViewControllerSDNestedTableViewController ;

  • Set File's Owner Base Class

    这与您的崩溃有点无关,但是当我查看该项目时,我看到了一个令人担忧的结构:
    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 包含功能可能很强大,但您要确保完成一些基本的内务处理。

    最后一次更新:

    我注意到这段代码中有一些错误。一、您使用currentSectionitem: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并在那里看到同样的问题。问题似乎是 cellIndexPathSDGroupCell定义为 assign属性(这意味着如果 iOS 确定它不再需要它为自己的目的创建的 indexPath,它将被释放,即使 SDGroupCell 维护对这个释放对象的 assign 引用)。只需更改 cellIndexPath SDGroupCell 的属性(property)来自 assignretain ,并且这个 iOS 6 错误消失了。我已通知开发者 SDNestedTable此问题,但此更改为 retain将修复代码在 iOS 6 中崩溃的问题。

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

    最良好的祝愿。

    关于iphone - 适用于 iOS 模拟器但不适用于 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791411/

    相关文章:

    objective-c - 我无法打开邮件应用程序?

    iphone - 接收滚动方向,power ios

    iphone - 无需在 iPhone 中调整大小即可获取 Facebook 个人资料图片

    iphone - UIView,如何判断触摸何时进入 View

    iphone - php -> JSON -> iPhone

    ios - 从 sqlite 数据库中选择时无法获取数据

    iphone - 简单的 ios 应用程序示例(UITabbarController、UITableView)

    iphone - 从核心数据中获取时, float 变为 0.0000

    ios - 使用 2 个组件在 UIPickerView 中水平移动隐藏行

    ios - 在 Xamarin.iOS 中为 UITableView 的默认部分标题添加底部边框