从回调中存储或复制 AXUIElementRef

问题描述 投票:0回答:1

我正在尝试存储由 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 中很容易实现,因为 这个项目 做到了。

objective-c struct memory-management axuielement
1个回答
0
投票

在文档中向上导航一级到 AXUIElement.h,其中显示:

应用程序中的每个可访问的用户界面元素都由 AXUIElementRef 表示,它是 CFTypeRef。 AXUIElementRefs(像所有 CFTypeRefs 一样)可以与所有 Core Foundation 多态函数一起使用,例如 CFRetain、CFRelease 和 CFEqual。”

© www.soinside.com 2019 - 2024. All rights reserved.