如何确定UIScrollView崩溃是在我的代码还是Apple的?

时间:2010-02-24 19:35:27

标签: iphone uiscrollview

我定期在我的iPhone上运行的调试版本中发生崩溃,涉及UIScrollView,而我的代码在堆栈框架中没有任何代码。我想知道它是否是我的代码或Apple的错误,我无法查询Apple错误数据库以查看是否已报告。回溯显示:

#0  0x30218060 in ___forwarding___ ()
#1  0x3020eda0 in __forwarding_prep_0___ ()
#2  0x309c4ce8 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] ()
#3  0x3025af60 in -[NSObject performSelector:withObject:] ()
#4  0x3098ea94 in -[UIAnimator stopAnimation:] ()
#5  0x3098e5a8 in -[UIAnimator(Static) _advance:] ()
#6  0x3098e460 in LCDHeartbeatCallback ()
#7  0x32047fe8 in HeartbeatVBLCallback ()
#8  0x32a1c3ec in IOMobileFramebufferNotifyFunc ()
#9  0x3188a74c in IODispatchCalloutFromCFMessage ()
#10 0x3020d0b0 in __CFMachPortPerform ()
#11 0x30254a76 in CFRunLoopRunSpecific ()
#12 0x3025416a in CFRunLoopRunInMode ()
#13 0x320452a4 in GSEventRunModal ()
#14 0x308f037c in -[UIApplication _run] ()
#15 0x308eea94 in UIApplicationMain ()
#16 0x0000280c in main (argc=1, argv=0x2ffff58c) at /Users/esilver/Documents/Husband Material/main.m:14

问题显然在UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded。 GDB报告:

-[MyViewController respondsToSelector:]: message sent to deallocated instance 0x5d77ad0

在MyViewController中,我确实有一个滚动tableView的调用:

[self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];  

因为它是动画的,所以在滚动动画完成之前,很可能会从导航控制器中弹出视图。看起来应该是UIView的工作是在卸载时取消或等待任何挂起的滚动操作。因此,我认为这是Apple代码中的一个错误。

或者我错了,是否有某种检查我的视图必须检查它是否在卸载之前滚动,还是我完全误读了这次崩溃?

仅供参考,此错误在低内存条件下也只会出现重现,即我已开始接收didReceiveMemoryWarning回调。

全心全意,

埃里克

2 个答案:

答案 0 :(得分:2)

我刚刚找到this thread on StackOverflow here

我认为这回答了我自己的问题。没关系...

答案 1 :(得分:1)

首先,委托应为弱/分配类型。但在这种情况下的事件是非常普遍的 滚动动画驱动的微妙障碍。如果您使用动画内容偏移更改 你的 ScrollViews 你强烈需要在 dealloc 方法中将委托设置为 nil

否则您将获得以下

[YourViewController respondsToSelector:]: message sent to deallocated instance

非常常见的例子:

1. _tableView is ivar of YourViewController
2. _tableView.delegate = self;
3. - (void)scrollViewDidScroll:(UIScrollView *)scrollView is implemented at YourViewController
4. at some point you call [_tableView scrollToRowAtIndexPath:indexPath 
   atScrollPosition:UITableViewScrollPositionBottom animated:YES];
   or [_tableView setContentOffset:CGPoint animated:YES]
   and try to close YourViewController

CoreAnimation保留_tableView,但是取消分配了YourViewController!