我目前正在编写一段使用事件抽头的代码。它正在按预期工作,但是我对一些没有很好记录的选项或者我不确定100%理解的问题有一些疑问。大多数情况下,在解释时,事件点击程序非常明确地给出了"只是这样做"但没有进一步的解释,我注意到了一些不同的可能性,苹果开发人员doc并没有给我很多启发(所以它一次只有太少或太多的信息)......所以:
CFMachPortRef machPortRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, eventTapCallback, NULL);
第一行,没问题都很清楚。
//// -----> kCFAllocatorDefault or NULL ???
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, machPortRef, 0);
1)在这里,我总是看到你应该放kCFAllocatorDefault
,但所有的doc状态都是"The allocator to use to allocate memory for the new object. Pass NULL or kCFAllocatorDefault to use the current default allocator."
所以不熟悉那些分配器或其他鳄鱼,为什么我们会通过{{1} } ???我认为NULL
不是一个非常有效的分配器......(这是一个非常有用的问题,只是好奇心)。
NULL
2)使用//// -----> CFRunLoopGetMain() or CFRunLoopGetCurrent() ???
CFRunLoopRef runLoop = CFRunLoopGetMain();
//CFRunLoopRef runLoop = CFRunLoopGetCurrent();
获取主循环和使用CFRunLoopGetMain()
获取当前循环之间的区别是什么?在哪种情况下哪一个最好用?
CFRunLoopGetCurrent()
3)//// -----> kCFRunLoopCommonModes or kCFRunLoopDefaultMode
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes);
//CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);
和kCFRunLoopCommonModes
之间的区别是什么?根据我的理解,kCFRunLoopDefaultMode
包含kCFRunLoopCommonModes
。所以你什么时候使用其中一个?
kCFRunLoopDefaultMode
别忘了激活你的水龙头。
非常感谢提前。我认为这些应该得到一些清晰简洁的解释,这对于人们进入事件点击是一个很大的帮助和节省时间。
答案 0 :(得分:1)
1)没关系。通过传递kCFAllocatorDefault
显式选择默认分配器,通过传递NULL
隐式选择默认分配器。系统当然不会使用NULL
,而是默认的分配器。
就个人而言,如果我关心默认值(“是的,我需要默认的分配器”),我个人也明确这样做了。否则我使用NULL(“不关心,系统会做对。”
2)每个线程都附加了一个运行循环。使用CFRunLoopGetMain()
,您可以获得主线程的运行循环,CFRunLoopGetCurrent()
可以获得线程的运行循环,您的代码当前正在运行。如果您的代码在主线程中运行,则相同,否则运行循环不同。
主线程上的主运行循环在主线程自动运行时自动启动。
您可以向流程添加其他线程(带有自己的运行循环)。通常你不想使用线程的运行循环,因为你在附加(后台)线程中进行更长时间的计算。但有时你需要在这个后台线程中运行循环,如果通过运行循环处理某些东西,i。即联网。
3)在默认模式下向主运行循环添加一个计时器,每秒写出一些东西并用鼠标进入菜单。你会看到差异......
仅当运行循环处于默认模式时,才会调度添加到默认模式的源,这意味着 - 在应用程序处于非模态状态时,简而言之。例如菜单或“本地运行循环调度”,同时拖动和放大在默认模式下不会完成丢弃。
简单地将模式视为一组来源。如果运行循环在该模式下运行,则仅调度模式中的每个源。所以它是一种选择的来源。
公共运行循环模式中的源是特殊的,因为它们总是独立于模式调度。