在 tableView 底部按 "back" 时导航控制器崩溃。如果我稍微向上滚动程序不会崩溃

Navigation controller crashes when pressing "back" while at the bottom of a tableView. If I scroll up slightly the program does not crash

我有两个页面,每个页面都有一个 tableView。当通过 push segue 按下单元格时,第一个 tableview 会导致第二个 tableView。我使用 "embed in" 将导航控制器应用于第一个视图控制器,它为第二个视图提供了一个后退按钮,该按钮适用于 99% 的应用程序。出于某种原因,如果我一直向下滚动到第二个 tableview 的底部,然后按后退按钮,应用程序会崩溃并出现此错误:Thread 1: EXC_BAD_ACCESS。来自控制台的回溯是这样的:

(lldb) bt
* thread #1: tid = 0x9517c, 0x000000011115a00b libobjc.A.dylib`objc_msgSend + 11, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    frame #0: 0x000000011115a00b libobjc.A.dylib`objc_msgSend + 11
    frame #1: 0x000000010ff1f462 UIKit`-[UIScrollView(UIScrollViewInternal) _notifyDidScroll] + 56
    frame #2: 0x000000010ff0fa42 UIKit`-[UIScrollView setContentOffset:] + 645
    frame #3: 0x000000010ff79b5f UIKit`-[UITableView setContentOffset:] + 362
    frame #4: 0x000000010ff24360 UIKit`-[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 1445
    frame #5: 0x000000010ff214ef UIKit`-[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 417
    frame #6: 0x000000010ff102d6 UIKit`-[UIScrollView removeFromSuperview] + 32
    frame #7: 0x000000010fee9e39 UIKit`-[UIView dealloc] + 404
    frame #8: 0x00000001111588cd libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 591
    frame #9: 0x000000010f045da6 CoreFoundation`_CFAutoreleasePoolPop + 22
    frame #10: 0x000000010f079ef3 CoreFoundation`__CFRunLoopRun + 2051
    frame #11: 0x000000010f079486 CoreFoundation`CFRunLoopRunSpecific + 470
    frame #12: 0x0000000113e329f0 GraphicsServices`GSEventRunModal + 161
    frame #13: 0x000000010fe8b420 UIKit`UIApplicationMain + 1282
  * frame #14: 0x000000010eb9122e appname`top_level_code + 78 at AppDelegate.swift:13
    frame #15: 0x000000010eb9126a appname`main + 42 at AppDelegate.swift:0
    frame #16: 0x000000011191d145 libdyld.dylib`start + 1
(lldb) 

如果我从第二个 tableView 的底部稍微向上滚动,程序不会崩溃。我添加导航控制器的方法是单击第一个视图控制器并使用 "embed in" 命令。当崩溃发生时,它会将我带到 AppDelegate 文件,如下所示:

是什么导致此程序以这种特定方式崩溃?

错误消息告诉我们 UIScrollView(它是 TableView 的一部分)正在尝试向其委托发送消息,该委托似乎在那个时间点被释放。

当您点击后退按钮时,UITableView 似乎没有被释放,但 UIViewController 被释放了。

这里有人提出了一个非常相似的问题:UIScrollView EXC_BAD_ACCESS crash in iOS SDK

追踪此问题的第一步是实施 UIViewController 子类的 dealloc 方法并将 UITableViewdelegate 设置为 nil。

您还应该打开 Zombies (Tracking down zombies with Xcode 5 on ios6) 以获取有关哪个已释放实例正在接收此消息的更多信息。