我的应用程序基本上获取用户输入,将其添加到tableview并转到具有scrollview的第二个视图控制器。用户输入只是城市名称,应用程序在滚动视图中提供详细的天气信息。
用户滚动时应用程序崩溃,然后单击本机后退按钮。你们有谁知道为什么会这样吗?顺便说一句,如果我不滚动,则单击后退按钮不会崩溃。
我的项目解决方案可以通过以下链接Download Solution
下载这是崩溃截图
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)
答案 0 :(得分:3)
1)转到产品>方案>编辑方案>运行>参数>环境
变量>将NSZombieEnabled
设为YES
。
2)构建并运行应用程序。而且,这是您应该在调试区域中看到的内容 -
weather_app[19317:4849510] *** -[ViewController scrollViewDidScroll:]: message sent to deallocated instance 0x7f9f4240bea0
3)同样,您可以使用Instruments来拦截NSZombie
。
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;
希望,这很有帮助。