我的应用程序创建UIView的自定义子类的实例,并添加水平放置在彼此相邻的实例。当我的UIView类的新实例被创建时,我可以将它添加到UIScrollView并重置内容大小。然后我打电话给 [UIScrollView setContentOffset:(some point) animated:NO]
。 这工作得很好。 问题是当我用动画调用上述方法时,即 [UIScrollView setContentOffset:(some point) animated:YES]
,应用程序崩溃。 调用堆栈看起来是这样的:如果使用动画调用setContentOffset,则UIScrollView崩溃
> #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()
当我使植物大战僵尸,应用输出产生:
*** -[__NSArrayM removeObject:]: message sent to deallocated instance 0x113dbb10
附加信息:UIScrollView的委托从未设置。我正在使用ARC。
如果iOS和OSX上有一条规则,它永远不会在除主线程之外的任何线程上操作UI。规则1。它并不是说它不喜欢它,它的禁止和苹果证明这是不止一个地方。 – 2012-08-14 11:15:34
是的,我忘了我从背景线程调用此方法的事实。只是以为我会张贴我的答案,以防有人处于同样令人沮丧的位置。 – 2012-08-14 15:31:59
不要忘记选择它作为SO让你的答案!所以人们知道这个问题已经回答了。 – 2012-08-14 16:01:46