UIScrollView使用不當(dāng)導(dǎo)致的Bug

今天修正了一個由于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
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,323評論 4 61
  • I recently upgraded to Android Studio 3 In our project we...
    WXL_JIANSHU閱讀 3,770評論 1 0
  • 今天早上起來,看到了我徒兒的信息:“師傅我有些東西沒辦法排解?!蔽乙豢磿r間原來是昨晚的,于是就問了一下怎么回事。 ...
    UC_Unicorn閱讀 496評論 0 6
  • 文/其樂龍融 善良是春天的細(xì)雨 稀稀疏疏 點(diǎn)綴夜晚...
    其樂龍融閱讀 520評論 0 3
  • 他是家里的頂梁柱 沉默寡言 不善言辭 削瘦的背影 微駝的肩 不好的脾氣 挑剔的毛病 可是有一天 他病了 原諒我回來...
    厭世時令閱讀 317評論 1 0

友情鏈接更多精彩內(nèi)容