會(huì)記錄一些奇葩的閃退問(wèn)題书蚪。
1.今日遇到一個(gè)閃退情況殊校,在iOS8中UIScrollView在放大縮小的時(shí)候閃退为流。
前提:進(jìn)入界面就會(huì)調(diào)用接口等接口回來(lái)后視圖放大功能让簿,在放大動(dòng)畫還沒有做的時(shí)候,返回到上一界面静汤,然后再次進(jìn)入當(dāng)前的ViewController 閃退居凶。
設(shè)備:6Plus
設(shè)備系統(tǒng):iOS8 (其他系統(tǒng)調(diào)用沒有這個(gè)問(wèn)題,可能iOS7 也存在當(dāng)前這個(gè)問(wèn)題侠碧。)
閃退的日志如下:
0 libobjc.A.dylib 0x000000019640bbd0 objc_msgSend + 16
1 UIKit 0x000000018a49b86c -[UIScrollView _getDelegateZoomView] + 76
2 UIKit 0x000000018a49b7ac -[UIScrollView _zoomScaleFromPresentationLayer:] + 32
3 UIKit 0x000000018a6af5c4 -[UIScrollView _zoomAnimationDidStop] + 96
4 UIKit 0x000000018a483c08 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184
5 UIKit 0x000000018a483b10 -[UIViewAnimationState animationDidStop:finished:] + 100
6 QuartzCore 0x0000000189da8f60 CA::Layer::run_animation_callbacks(void*) + 292
7 libdispatch.dylib 0x0000000196a3d368 _dispatch_client_callout + 12
8 libdispatch.dylib 0x0000000196a4197c
根據(jù)閃退日志顯示药蜻,是UIScrollView 在做放大縮小的時(shí)候調(diào)用了 getDelegateZoomView (delegate 中的 viewForZoomingInScrollView )這個(gè)方法替饿,然后開始調(diào)用objc_msgSend (消息傳遞 不懂的可以看下Runtime方面的知識(shí))方法執(zhí)行后出現(xiàn)閃退。
分析情況:如果調(diào)用方法的時(shí)候發(fā)現(xiàn)閃退视卢,就是被調(diào)用的類沒有當(dāng)前這個(gè)方法而閃退。 那么出現(xiàn)的情況是:1.當(dāng)前的這個(gè)類已經(jīng)被釋放惋砂,2.當(dāng)前的這個(gè)類并沒有實(shí)現(xiàn)當(dāng)前這個(gè)方法西饵。
排除第2種猜測(cè),原因是當(dāng)前在使用正常的情況下是沒有問(wèn)題的眷柔,當(dāng)前的ViewController 也實(shí)現(xiàn)了 viewForZoomingInScrollView 這個(gè)方法积蜻。
所以是當(dāng)前這個(gè)ViewController已經(jīng)被釋放了,但是還是調(diào)用了delegate viewForZoomingInScrollView方法宙拉。
目前的情況是只出現(xiàn)在iOS8設(shè)備上丙笋,猜測(cè)iOS8 上ViewController釋放了但是UIScrollView delegate 沒有釋放。
修改方法:
1.在ViewController 釋放的時(shí)候 dealloc這個(gè)方法中锥忿,對(duì) UIScrollView.delegate = nil怠肋;
- (void)dealloc{
_scrollView.delegate = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
為什么使用 _scrollView 呢?
當(dāng)前的scrollView是懶加載的方式钉答,如果在dealloc中調(diào)用 self.scrollView 會(huì)重新去調(diào)用ScrollView的生成 從而引發(fā)內(nèi)存不釋放的問(wèn)題。
思考: 拿到Crash日志仑性,一看系統(tǒng)調(diào)用的時(shí)候掛了右蹦,就歸類到系統(tǒng)問(wèn)題了,無(wú)法處理晨汹。有時(shí)候堅(jiān)持一下,多看一會(huì)兒宰缤,多想一下慨灭,嘗試去Google上搜一下Crash信息中的一些字段球及,或許別人也有遇到過(guò)相同或者相似的問(wèn)題,說(shuō)不定得到啟發(fā)從而解決了一個(gè)看似沒法解決的問(wèn)題筹陵。