创建“ NSEvent对象”,然后创建“ CGEventPost”,创建“ [ev CGEvent]”然后退出方法是否安全?

时间:2019-07-06 13:41:09

标签: objective-c automatic-ref-counting nsevent cgeventtap

我有以下Objective-C代码段:

void toggle()
{
    NSEvent* down_event = [NSEvent keyEventWithType: NSEventTypeKeyDown
                                           location: NSZeroPoint
                                      modifierFlags: 0
                                          timestamp: 0.0
                                       windowNumber: 0
                                            context: nil
                                         characters: @" "
                        charactersIgnoringModifiers: @" "
                                          isARepeat: false
                                            keyCode: kVK_Space ];


    CGEventPost(kCGHIDEventTap, [down_event CGEvent]);
}

该项目已启用ARC。

这样安全吗,还是在运行偶发性内存访问错误的手套?

我担心NSObject可能在系统仍在使用CGEvent的情况下被垃圾回收。

1 个答案:

答案 0 :(得分:1)

是的,这很安全。 CGEvent属性的documentation指出:

  

返回的CGEventRef不透明类型会自动释放。如果无法创建与CGEventRef对象相对应的NSEvent对象,则此方法返回NULL

这告诉您创建了一个新的CGEvent 对应于NSEvent 。如果存在危险依赖关系,例如返回值包含对原始对象的不安全引用,该引用将被记为(有/有这样做的方法,并且已经记录在案[是的,我还没有检查是否仍然存在]) / em>。

顺便说一句:如果您在ARC时代长大并且不了解“自动发布”,请不要担心自己,ARC知道并且会做正确的事。