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

Is it safe to create `NSEvent object` then `CGEventPost` the `[ev CGEvent]` then exit the method?

我有以下 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 时被垃圾收集。

是的,它很安全。 CGEvent 属性 的 documentation 状态:

The CGEventRef opaque type returned is autoreleased. If no CGEventRef object corresponding to the NSEvent object can be created, this method returns NULL.

这告诉您 创建了一个新的 CGEvent 对应 NSEvent。如果存在 危险的 依赖项,例如return 值包含对原始对象的不安全引用,该引用将被记录 (有 was/are 方法 did/do 和 were/are 如此记录 [是的,我还没有检查是否仍然存在]).

顺便说一句:如果你在 ARC 时代长大并且不了解 "autoreleased",请不要担心,ARC 知道并且会做正确的事。