美文网首页
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