这个API本意是:让数组中的每个元素都自动执行某个方法,思路很好,代码简单,功能强大。但是,背后的机制到底是什么?怎么个执行方式?微观上到底是线性阻塞式还是定时器并发式还是轮询式?CPU的任务调度序列到底是怎么样的?
最近就遇到这个事情了
在某个view中,执行
[self.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
结果崩溃了,sublayers大概有200个吧。
但是,换用下面的方式就顺利通过
NSArray* arrSubLayers = self.layer.sublayers;
for (int i=0;i<arrSubLayers.count;i++)
{
[arrSubLayers[i] removeFromSuperlayer];
}
据此猜测:makeObjectsPerformSelector是基于RunLoop机制做的,本语句执行后 只是把要做的任务丢入了RunLoop的待执行任务队列,等待loop调度触发执行,而并不等待任务执行完毕才执行后面的其他语句。
而下面的那个方式是 阻塞式跳转执行。所以,那个 makeObjectsPerformSelector 这个API,执行之后,array中的元素不一定就执行完了你指定的那个方法,有可能还没有任何一个元素有机会被调度执行它的方法。。