美文网首页
makeObjectsPerformSelector 背后的机制

makeObjectsPerformSelector 背后的机制

作者: 糊涂糊涂啊 | 来源:发表于2017-12-23 19:26 被阅读14次

文章引用了这里

这个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中的元素不一定就执行完了你指定的那个方法,有可能还没有任何一个元素有机会被调度执行它的方法。

执行完之后,数组中的元素就会被改变,如果想继续保存有原数组,需要以下做法:(参考地址)

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];

还有另一个方法:

[self.view.subviews makeObjectsPerformSelector:@selector(isHidden) withObject:@YES];

相关文章

网友评论

      本文标题:makeObjectsPerformSelector 背后的机制

      本文链接:https://www.haomeiwen.com/subject/cabqgxtx.html