如果使用动画调用setContentOffset,UIScrollView将崩溃

时间:2012-08-13 17:09:20

标签: ios uiview uiscrollview

我的应用程序创建了UIView的自定义子类的实例,并添加了彼此水平放置的实例。创建我的UIView类的新实例时,我可以将其添加到UIScrollView并重置contentize。然后我打电话 [UIScrollView setContentOffset:(some point) animated:NO]。 这很好用。 问题是当我用动画调用上述方法时,即 [UIScrollView setContentOffset:(some point) animated:YES] ,应用程序崩溃。 调用堆栈如下所示:

> #0    0x3145b870 in ___forwarding___ ()
> #1    0x313b6650 in _CF_forwarding_prep_0 ()
> #2    0x317d84a2 in -[UIAnimator stopAnimation:] ()
> #3    0x317d84a2 in -[UIAnimator stopAnimation:] ()
> #4    0x317d7f0e in -[UIAnimator(Static) _advance:withTimestamp:] ()
> #5    0x317d7e00 in -[UIAnimator(Static) _LCDHeartbeatCallback:] ()
> #6    0x3531d86e in CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) ()
> #7    0x3531d7c4 in CA::Display::IOMFBDisplayLink::callback(__IOMobileFramebuffer*,
> unsigned long long, unsigned long long, unsigned long long, void*) ()
> #8    0x33a56000 in IOMobileFramebufferVsyncNotifyFunc ()
> #9    0x36e3c60c in IODispatchCalloutFromCFMessage ()
> #10   0x31422f12 in __CFMachPortPerform ()
> #11   0x3142d522 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
> #12   0x3142d4c4 in __CFRunLoopDoSource1 ()
> #13   0x3142c312 in __CFRunLoopRun ()
> #14   0x313af4a4 in CFRunLoopRunSpecific ()
> #15   0x313af36c in CFRunLoopRunInMode ()
> #16   0x32888438 in GSEventRunModal ()
> #17   0x316b4cd4 in UIApplicationMain ()

当我启用Zombies时,应用程序输出会产生:

*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x113dbb10

其他信息:永远不会设置UIScrollView的委托。我正在使用ARC。

2 个答案:

答案 0 :(得分:3)

我发现了我的问题。 我正在调用从后台线程调用setContentOffset的方法。

BackgroundThread --> My random processing method --> Setup new UIView and add it to UIScrollView --> Call setContentOffset with animations

以上流程导致崩溃。当我从主线程调用相同的处理方法时,它工作得很好。

显然iOS不喜欢从后台线程调用的动画。

答案 1 :(得分:0)

scrollView中的一个视图正在发布。当你关闭动画时,你可能会“跳过”它 - 当它打开时,系统会尝试获得一系列变化的“快照”,当它试图访问一个视图时,你就可以了。因此,您可以启用Zombies并确切地了解正在获取消息的对象类型,并且在调试器中您可以“po”该对象。

另一种方法是编写我们自己的测试动画,在没有动画的循环中一次移动contentOffset说20个像素,并观察它何时崩溃(肯定会)!