首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >osX : runLoop选项(创建事件按钮时)

osX : runLoop选项(创建事件按钮时)
EN

Stack Overflow用户
提问于 2014-11-26 04:57:56
回答 1查看 1.3K关注 0票数 1

我目前正在编写一段代码,它使用事件点击。这是它的工作,但我有一些问题,一些选项没有很好的记录,或我不确定是否理解100%好。当被解释的时候,事件的点击过程通常被认为是“只需要这样做”,但是没有进一步的解释,我注意到了一些不同的可能性,而苹果开发人员的文档并没有给我很大的启发(所以每次信息太少或者太多).因此:

代码语言:javascript
复制
CFMachPortRef machPortRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, eventTapCallback, NULL);

第一行,没有问题,一切都很清楚。

代码语言:javascript
复制
//// -----> kCFAllocatorDefault or NULL ???         
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, machPortRef, 0); 

1)在这里,我总是看到您应该使用kCFAllocatorDefault,但是所有的文档状态都是"The allocator to use to allocate memory for the new object. Pass NULL or kCFAllocatorDefault to use the current default allocator.",所以不熟悉这些分配器或其他鳄鱼,我们为什么要通过NULL?我想NULL不是一个非常有效的分配器..。(这是个额外的问题,只是好奇)。

代码语言:javascript
复制
//// -----> CFRunLoopGetMain() or CFRunLoopGetCurrent() ??? 
CFRunLoopRef runLoop = CFRunLoopGetMain(); 
//CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 

2)用CFRunLoopGetMain()获得主回路与用CFRunLoopGetCurrent()获得电流环有什么区别?在这种情况下哪一种最好使用?

代码语言:javascript
复制
//// -----> kCFRunLoopCommonModes or kCFRunLoopDefaultMode 
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes);
//CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);

( 3) kCFRunLoopCommonModeskCFRunLoopDefaultMode有什么区别?据我所知,kCFRunLoopCommonModes包括kCFRunLoopDefaultMode。那么你什么时候使用其中一种?

代码语言:javascript
复制
CGEventTapEnable(machPortRef, true);

别忘了激活你的踢踏舞。

提前谢谢。我认为这些应该得到一些明确和简洁的解释,这将是一个伟大的帮助和节省时间,人们进入事件的水龙头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 05:26:48

1)这不重要。通过传递kCFAllocatorDefault,您显式地选择了默认分配器,通过传递NULL,您隐式地选择了默认分配器。当然,系统不会使用NULL,而是默认的分配器。

就我个人而言,如果我关心默认情况(“是的,我需要默认的分配器”),那么我会使用NULL (“不关心,系统会做的对”)。

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

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

您可以向进程中添加额外的线程(有它们自己的运行循环)。通常,您不希望使用线程的run循环,因为在附加(背景)线程中需要更长的计算时间。但是有时您需要在这个后台线程中运行循环,如果通过run循环(即联网)来处理的话。

3)在默认模式下,在主运行循环中添加一个计时器,它每秒钟写出一些内容,然后用鼠标输入菜单。您将看到不同的…

添加到默认模式的源只有在运行循环处于默认模式时才被分派,这意味着--长话短说--当应用程序处于非模态状态时。例如,在默认模式下不执行拖放时的菜单或“本地运行循环调度”。

简单地把模式看作是一组资源。如果运行循环在运行模式中运行,则仅分配模式中的每个源。因此,它是一种来源的选择。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27141645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档