在 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
方法并将 UITableView
的 delegate
设置为 nil。
您还应该打开 Zombies (Tracking down zombies with Xcode 5 on ios6) 以获取有关哪个已释放实例正在接收此消息的更多信息。
我有两个页面,每个页面都有一个 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
方法并将 UITableView
的 delegate
设置为 nil。
您还应该打开 Zombies (Tracking down zombies with Xcode 5 on ios6) 以获取有关哪个已释放实例正在接收此消息的更多信息。