- 防止子線程訪問UI
UIKit的大部分對(duì)象都不是線程安全的浅乔,所有繼承自UIResponder的類都需要在主線程操作手幢,如果在子線程更改了這些UI對(duì)象就會(huì)導(dǎo)致未知道的行為哩掺,比如隨機(jī)出現(xiàn)丟失動(dòng)畫云芦、頁(yè)面錯(cuò)亂甚至crash关炼〕谈梗可以嘗試一下以下代碼,在子線程調(diào)用100次后儒拂,很可能會(huì)導(dǎo)致整個(gè)app丟失動(dòng)畫寸潦。
1
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
為了防止在子線程操作UI,我們?cè)陂_發(fā)階段hook掉UIView社痛、CALayer的setNeedsLayout见转、setNeedsDisplay、setNeedsDisplayInRect:三個(gè)方法蒜哀,當(dāng)調(diào)用這三個(gè)方法時(shí)判斷是否在主線程斩箫,如果不在主線程調(diào)用就讓程序crash,在crash堆棧能看出是哪里的問題撵儿。