- 防止子线程访问UI
UIKit的大部分对象都不是线程安全的,所有继承自UIResponder的类都需要在主线程操作,如果在子线程更改了这些UI对象就会导致未知道的行为,比如随机出现丢失动画、页面错乱甚至crash。可以尝试一下以下代码,在子线程调用100次后,很可能会导致整个app丢失动画。
1
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
为了防止在子线程操作UI,我们在开发阶段hook掉UIView、CALayer的setNeedsLayout、setNeedsDisplay、setNeedsDisplayInRect:三个方法,当调用这三个方法时判断是否在主线程,如果不在主线程调用就让程序crash,在crash堆栈能看出是哪里的问题。