导航后退按钮崩溃

时间:2014-10-15 15:07:27

标签: ios xcode

我的应用程序基本上获取用户输入,将其添加到tableview并转到具有scrollview的第二个视图控制器。用户输入只是城市名称,应用程序在滚动视图中提供详细的天气信息。

用户滚动时应用程序崩溃,然后单击本机后退按钮。你们有谁知道为什么会这样吗?顺便说一句,如果我不滚动,则单击后退按钮不会崩溃。

我的项目解决方案可以通过以下链接Download Solution

下载

这是崩溃截图 enter image description here

enter image description here

Backtrace -

(lldb) bt
* thread #1: tid = 0x6cac58, 0x000000010e1eb00b libobjc.A.dylib`objc_msgSend + 11, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    frame #0: 0x000000010e1eb00b libobjc.A.dylib`objc_msgSend + 11
    frame #1: 0x000000010cb25c9c UIKit`-[UIScrollView(UIScrollViewInternal) _notifyDidScroll] + 56
    frame #2: 0x000000010cb16262 UIKit`-[UIScrollView setContentOffset:] + 645
    frame #3: 0x000000010cb2ab9c UIKit`-[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 1445
    frame #4: 0x000000010cb27d2b UIKit`-[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 417
    frame #5: 0x000000010cb16af6 UIKit`-[UIScrollView removeFromSuperview] + 32
    frame #6: 0x000000010caf0d19 UIKit`-[UIView dealloc] + 404
    frame #7: 0x000000010e1e98cd libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 591
    frame #8: 0x000000010e432346 CoreFoundation`_CFAutoreleasePoolPop + 22
    frame #9: 0x000000010e466473 CoreFoundation`__CFRunLoopRun + 2051
    frame #10: 0x000000010e465a06 CoreFoundation`CFRunLoopRunSpecific + 470
    frame #11: 0x0000000110c539f0 GraphicsServices`GSEventRunModal + 161
    frame #12: 0x000000010ca92550 UIKit`UIApplicationMain + 1282
  * frame #13: 0x000000010c75c623 weather_app`main(argc=1, argv=0x00007fff534da2e0) + 115 at main.m:16
    frame #14: 0x000000010ecbf145 libdyld.dylib`start + 1
(lldb) 

1 个答案:

答案 0 :(得分:3)

1)转到产品>方案>编辑方案>运行>参数>环境     变量>将NSZombieEnabled设为YES

2)构建并运行应用程序。而且,这是您应该在调试区域中看到的内容 -

weather_app[19317:4849510] *** -[ViewController scrollViewDidScroll:]: message sent to deallocated instance 0x7f9f4240bea0

3)同样,您可以使用Instruments来拦截NSZombie

enter image description here


4)查看[ViewController scrollViewDidScroll:]方法。我留下它让你思考如何/为什么控制不应该发送到这个方法中的解除分配对象。

5)摆脱这种方法 - scrollViewDidScroll:scrollView。并使用scrollViewDidEndDecelerating:方法更新指标。这应该运行你的程序而不会崩溃。

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    pageControlBeingUsed = NO;

    // Switch the indicator when more than 50% of the previous/next page is visible
    CGFloat pageWidth = self.scrollView.frame.size.width;
    int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageControl.currentPage = page;
}

6)此外,您的计划中有很多警告,例如没有设置代理人 - <UINavigationControllerDelegate, UITableViewDataSource, UITableViewDataSource>和缺少self.scrollView.delegate = self;

希望,这很有帮助。