今天修正了一個由于UIScrollView使用不當(dāng)?shù)膶?dǎo)致的bug.
場景是這樣的:
在一個視圖里, 有滾動顯示的圖片. 圖片是放在一個UIScrollView里的, 利用一個定時器, 每隔一定時間, 比如三秒, 調(diào)用UIScrollView的滾動方法, 定時器周期調(diào)用的方法如下:
-(void)dida {
[scrollView scrollRectToVisible:rect animated:YES]
}
進(jìn)行滾動.
之后就發(fā)現(xiàn), app在各個視圖之間切換的時候, 會崩潰. 系統(tǒng)報EXEC_BAD_ACCESS, 開啟僵尸對象之后(Enable Zombie Objects), 發(fā)現(xiàn)是上面的滾動視圖代碼訪問了已經(jīng)銷毀的對象.
在對象的銷毀方法里, 已經(jīng)停止并刪除了定時器, 怎么還會產(chǎn)生這種問題呢?
-(void)dealloc {
_timer.invalidate()
_timer=0
}
問題就出在animated這個參數(shù)上, 這個參數(shù)會讓滾動變成一個持續(xù)一定時長的動畫, 也就是說, 這個函數(shù)不會立即執(zhí)行完畢, 而是會"飛"一段時間. 在飛的過程中, 對象銷毀了, 但是方法還在持續(xù)修改視圖的屬性, 這就導(dǎo)致了crash.
所以在對象銷毀的時候, 要讓在”飛”的方法, 停下來. UIScrollView沒有直接提供相關(guān)方法, 但是可以在銷毀的時候, 非動畫的滾動一次, 來停止可能存在的”飛”的滾動方法. 修改成下面代碼后, 問題解決.
-(void)dealloc {
[scrollView scrollRectToVisible:rect animated:NO]
_timer.invalidate()
_timer=0
}