使用自动引用计数(ARC)进行指针转换时出现问题

8

我的项目正在使用自动引用计数,我想要使用以下辅助功能API函数:

extern AXError AXUIElementCopyAttributeValue (
    AXUIElementRef element,
    CFStringRef attribute,
    CFTypeRef *value);

要调用该函数,我会这样做:
NSArray *subElements = nil;
AXUIElementCopyAttributeValue(..., (CFArrayRef *)&subElements);

然而,ARC关于最后一个参数抛出了以下错误:
error: Automatic Reference Counting Issue: Cast of an indirect pointer to an Objective-C pointer to 'CFArrayRef *' (aka 'const struct __CFArray **') is disallowed with ARC

我该如何解决这个问题?


与 ARC 兼容的工具仍处于 NDA 约束之下。您应该在 Apple 的开发者论坛 上发布此类问题。 - Rob Keniger
3
@Rob:从技术上讲并不完全正确;ARC编译器是LLVM的一个新版本,而LLVM是开源的,并且这些更改已经被提交。整个过程已经在http://clang.llvm.org/docs/AutomaticReferenceCounting.html 上进行了充分的记录(尽管从编译器和语法的角度来看;我相信苹果提供的任何东西都会更加友好)。 - Tommy
1个回答

10

你是否尝试使用中间的CFArrayRef,这样你仍然可以传递一个指向引用的指针(即指向指针的指针)给 AXUIElementCopyAttributeValue ,但随后可以通过普通转换实现免费桥接?例如:

CFArrayRef subElementsCFArray;
AXUIElementCopyAttributeValue(..., &subElementsCFArray);

NSArray *subElements = (__bridge NSArray *)subElementsCFArray;

3
你的理论是正确的,但实现方式有误。我已经更新了你的代码答案,使其能够在ARC下编译通过。谢谢! - Chetan
1
在我看来,你没有将所有权转移到ARC,因此你必须在这里释放CFArrayRef。如果你使用(__bridge_transfer NSArray *),你就可以跳过这一步。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接