2012-08-13 82 views
2

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

回答

2

我發現我的問題。 我正在調用從後臺線程調用setContentOffset的方法。

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

上述流程導致崩潰。當我從主線程調用相同的處理方法時,它工作得很好。

顯然iOS不喜歡從後臺線程調用的動畫。

+0

如果iOS和OSX上有一條規則,它永遠不會在除主線程之外的任何線程上操作UI。規則1。它並不是說它不喜歡它,它的禁止和蘋果證明這是不止一個地方。 – 2012-08-14 11:15:34

+0

是的,我忘了我從背景線程調用此方法的事實。只是以爲我會張貼我的答案,以防有人處於同樣令人沮喪的位置。 – 2012-08-14 15:31:59

+0

不要忘記選擇它作爲SO讓你的答案!所以人們知道這個問題已經回答了。 – 2012-08-14 16:01:46

0

scrollView中的一個視圖正在發佈。當你關閉動畫的時候,你可能會「跳過」它 - 當它開啓時,系統會試圖獲得一系列變化的「快照」,當它試圖訪問一個視圖繁榮時,你就會去。所以你可以啓用Zombies並找出到底是什麼類型的對象獲取消息,並且在調試器中你可能會「po」那個對象。

另一種方法是編寫我們自己的測試動畫,將contentOffset一次移動20個像素,並且沒有動畫,然後觀察它何時崩潰(肯定會)!

+0

我嘗試了一個手動循環,雖然屏幕有點跳躍到沒有任何動畫的偏移,但似乎沒有造成任何問題。我的循環相當於不帶動畫調用setContentOffset。 – 2012-08-14 03:38:20

相關問題