我正在尝试存储由 AXObserverCallback
回调提供的
AXUIElementRef。当回调作用域结束时,我相信该结构被释放,并且我无法再在其他地方使用它。
有没有办法保留或复制这个引用到我自己的数据结构中?
相关代码如下:
AXObserverCreate(..., &observer_callback, ...);
AXObserverAddNotification(..., ..., kAXWindowCreatedNotification, this);
...
void observer_callback(AXObserverRef observer, AXUIElementRef windowRef,
CFStringRef notificationName, void* inUserData) {
applications* apps = (applications*)inUserData;
if (CFEqual(notificationName, kAXWindowCreatedNotification)) {
// memory error when trying to use windowRef outside of callback
apps->add_window_ref(windowRef);
} else if (CFEqual(notificationName, kAXUIElementDestroyedNotification)) {
apps->remove_window_ref(windowRef);
}
}
我知道这在 Swift 中很容易实现,因为 这个项目 做到了。
在文档中向上导航一级到 AXUIElement.h,其中显示:
应用程序中的每个可访问的用户界面元素都由 AXUIElementRef 表示,它是 CFTypeRef。 AXUIElementRefs(像所有 CFTypeRefs 一样)可以与所有 Core Foundation 多态函数一起使用,例如 CFRetain、CFRelease 和 CFEqual。”