这个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中的元素不一定就执行完了你指定的那个方法,有可能还没有任何一个元素有机会被调度执行它的方法。。
本文探讨了makeObjectsPerformSelector API的工作机制,并对比了其与传统遍历方式的区别。通过实际案例分析,揭示了该API可能基于RunLoop机制实现,导致执行非阻塞性质,从而在大量数据处理时出现预期之外的行为。
3924

被折叠的 条评论
为什么被折叠?



