我的應用程序創建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