1

这是block用来调用的代码:

dispatch_async(dispatch_get_main_queue(), ^{
   [self doSomething];
});

而这个正在调用使用selector

[self performSelectorOnMainThread:@selector(doSomething)
 withObject:nil
waitUtilDone:NO];
4

1 回答 1

2

是的——在第一种情况下,您创建一个块并将其发布到主队列。dispatch_asynccopy块。复制一个块会导致它保留它引用的每个对象。所以self将被保留,就像您在块中提到的任何其他对象一样。控制区块的机制是 Grand Central Dispatch。

在第二种情况下,您只需doSomething在主线程上安排调用。进行调用的机制将是一个运行循环。self最多保留一个参数对象。

GCD 和运行循环之间的区别在于运行循环具有模式。只有当运行循环处于兼容模式时,您才可以排队执行。在实践中,您最常使用它,将某些事情排队等待在NSDefaultRunLoopMode. 当用户与用户界面交互时,它会切换到默认模式以外的模式。因此,在用户停止交互之前,您的工作不会发生。例如,在 iOS 上,用户被认为是在他们的手指向下时进行交互。因此,您可以安排您知道太繁重而无法继续平滑滚动的工作,这样直到用户完成交互后才会立即发生。

您提名的选择器将使用NSRunLoopCommonModes其中包括跟踪(用户交互)模式但与performSelectorOnMainThread:...modes:.

于 2013-10-01T00:12:50.103 回答