[ios]导航后退按钮崩溃

标签: Xcode ios
发布时间: 2017/3/28 23:01:55
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我的应用程序基本上获取用户输入,将其添加到表和去第二个视图控制器具有滚动视图。用户输入简单地市名称,并且该应用程序在滚动视图中提供详细的气象信息。

应用程序崩溃时用户滚动然后单击本机后退按钮。任何的你是否有任何想法为什么发生这种情况?顺便说一句,如果我不向下滚动,然后单击后退按钮没有死机。

我的项目解决方案可能会在下面的链接下载解决方案下载

这里是崩溃屏幕截图enter image description here

enter image description here

回溯-

(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:

1) 转到产品 > 计划 > 编辑计划 > 运行 > 参数 > 环境变量 > 设置 NSZombieEnabledYES

2) 生成并运行该应用程序。而且,这是在调试区域-你应该看到什么

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

3) 同样,你可以使用文书拦截 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;

希望,这是有益的。

赞助商