osX:runLoop选项(创建事件点击时)

时间:2014-11-26 04:57:57

标签: c++ ios objective-c macos events

我目前正在编写一段使用事件抽头的代码。它正在按预期工作,但是我对一些没有很好记录的选项或者我不确定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

别忘了激活你的水龙头。

非常感谢提前。我认为这些应该得到一些清晰简洁的解释,这对于人们进入事件点击是一个很大的帮助和节省时间。

1 个答案:

答案 0 :(得分:1)

1)没关系。通过传递kCFAllocatorDefault显式选择默认分配器,通过传递NULL隐式选择默认分配器。系统当然不会使用NULL,而是默认的分配器。

就个人而言,如果我关心默认值(“是的,我需要默认的分配器”),我个人也明确这样做了。否则我使用NULL(“不关心,系统会做对。”

2)每个线程都附加了一个运行循环。使用CFRunLoopGetMain(),您可以获得主线程的运行循环,CFRunLoopGetCurrent()可以获得线程的运行循环,您的代码当前正在运行。如果您的代码在主线程中运行,则相同,否则运行循环不同。

主线程上的主运行循环在主线程自动运行时自动启动。

您可以向流程添加其他线程(带有自己的运行循环)。通常你不想使用线程的运行循环,因为你在附加(后台)线程中进行更长时间的计算。但有时你需要在这个后台线程中运行循环,如果通过运行循环处理某些东西,i。即联网。

3)在默认模式下向主运行循环添加一个计时器,每秒写出一些东西并用鼠标进入菜单。你会看到差异......

仅当运行循环处于默认模式时,才会调度添加到默认模式的源,这意味着 - 在应用程序处于非模态状态时,简而言之。例如菜单或“本地运行循环调度”,同时拖动和放大在默认模式下不会完成丢弃。

简单地将模式视为一组来源。如果运行循环在该模式下运行,则仅调度模式中的每个源。所以它是一种选择的来源。

公共运行循环模式中的源是特殊的,因为它们总是独立于模式调度。