【发布时间】:2024-01-19 00:28:01
【问题描述】:
我以两种方式拦截CGEventRefs:
- 返回值
NULL杀死事件 - 通过
CGEventCreateKeyboardEvent()为事件分配新的CGEventRef
Xcode 的分析器告诉我在创建新事件时可能存在泄漏。但是我需要返回那个新事件,所以我不能在那里CFRelease它。
这个 Xcode 错误有效吗?
我应该在哪里正确地
CFReleaseing 我创建的新 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;
}
【问题讨论】:
标签: xcode macos automatic-ref-counting macos-carbon core-foundation