3

CGEventRef以两种方式拦截 s:

  • 返回值NULL杀死事件
  • 为事件分配新的CGEventRef通过CGEventCreateKeyboardEvent()

Xcode 的分析器告诉我在创建新事件时可能存在泄漏。但我需要返回那个新事件,所以我不能CFRelease在那里。

  • 这个 Xcode 错误有效吗?

  • 我应该在哪里正确CFRelease设置我创建的新 CGEventRef?

  • 在 null 和 new 事件的情况下,我不知道是否需要释放事件的以前的值。

  • 将“新”附加到方法名称是解决此问题的正确方法吗?对于我创建新事件的情况,我认为可能是这样。但是其他情况呢?

.

- (CGEventRef)modifySomeKeyboardEvents:(CGEventRef)event {

    CGKeyCode keycode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
    NSLog(@"keycode: %d", keycode);

    switch (keycode) {
        case 0:
            NSLog(@"pressed 'a'");
            //Kill the event
            event = NULL;

            //Is a `CFRelease` of some kind needed here, to release the previous value?

            break;

        case 38:
            NSLog(@"pressed 'h'");

            //Send different character:
            CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
            CGEventRef newKeyEvent = CGEventCreateKeyboardEvent(eventSource, 1, true);
            CGEventSetIntegerValueField(newKeyEvent, kCGKeyboardEventKeycode, 51); // keycode '51' = backspace
            CFRelease(eventSource);

            event = newKeyEvent;

            //Can't CFRelease here, but somewhere?
            //CFRelease(newKeyEvent);

            break;

        default:
            break;
    }

    //Xcode error: "Potential leak of an object stored in newKeyEvent"
    return event;
}
4

1 回答 1

3

CGEventTapCallback文件_

新事件传回事件系统后,新事件将与原事件一起发布。

因此,您负责发布新事件或旧事件。

分析仪不知道这一点,所以你需要告诉它。您可以通过在方法名称new开头放置分析器来使分析器静音,但使用 可能会更清楚copy,这也会使警告静音:

- (CGEventRef)copyOrModifyKeyboardEvent:(CGEventRef)event {

(我想newOrModifiedKeyboardEvent:也可以。)

我相信分析器也应该标记这一点,因为当您仅返回输入事件时,它现在无法返回 +1 引用计数。但在我的测试中,它没有。Xcode 4.6.2 分析器没有给我这个方法的警告:

- (CGEventRef)copyOrModifyEvent:(CGEventRef)event {
    CGEventRef newEvent;
    if (CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 38) {
        newEvent = CGEventCreate(NULL);
    } else {
        newEvent = event;
    }
    return newEvent;
}
于 2013-04-18T23:35:04.750 回答