我试图更好地理解运行循环,因为它们适用于 Mac 应用程序(NSRunLoop),但这也可能是一个更普遍的问题。NSRunLoop 文档说:
...您的代码提供了驱动运行循环的
while
orfor
循环。在您的循环中,您使用运行循环对象来“运行”接收事件并调用已安装处理程序的事件处理代码。
文档有一个这样的代码示例:
BOOL shouldKeepRunning = YES;
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
所以代码一直调用运行循环,直到它决定它应该终止。方法“-runMode:beforeDate:
运行一次循环,在指定的模式下阻塞输入,直到给定的日期。” 还有一种-run
方法,“将接收器置于一个永久循环中,在此期间它处理来自所有附加输入源的数据”。
重复调用运行循环(或调用-run
,听起来像,这本身)怎么可能不消耗 CPU?Cocoa 应用程序可以在其主运行循环运行时闲置在后台,它将消耗零(或接近零)的 CPU 时间。
在内部-runMode:beforeDate:
,运行循环如何在没有轮询和消耗 CPU 的情况下阻塞直到接收到输入或计时器触发?