以下是使用block
致电的代码:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
这个人正在使用selector
调用:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUtilDone:NO];
答案 0 :(得分:2)
是 - 在第一种情况下,您创建一个块并将其发布到主队列。 dispatch_async
将copy
阻止。复制块会导致它保留它引用的每个对象。因此,self
将被保留,就像您在块中提到的任何其他对象一样。持有该区块的机制是Grand Central Dispatch。
在第二种情况下,您只需在主线程上安排对doSomething
的调用。进行调用的机制将是一个运行循环。 self
并且最多只保留一个参数对象。
GCD和运行循环之间的区别在于运行循环具有模式。只有在运行循环处于兼容模式时才会将事务排队。在实践中,您最常使用的是通过排队在NSDefaultRunLoopMode
中发生的事情。当用户与用户界面交互时,它切换到默认模式以外的模式。因此,在用户停止交互之前,您的工作不会发生。例如。在iOS上,用户被认为是在他们的手指停止时进行交互。所以你可以安排你知道太重的工作,比如平滑滚动继续下去,直到用户完成交互后不会发生这种情况。
您指定的选择器将使用NSRunLoopCommonModes
,其中包括跟踪(用户互动)模式,但与performSelectorOnMainThread:...modes:
进行比较和对比。