文章引用了这里
这个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];
网友评论