ARC不兼容类型铸造
我正在使用从Apple的有用UIElementUtilities应用程序中借用的Core Foundations方法。问题是我希望更新这个借用的方法,以便在Apple的新自动引用计数(ARC)系统下运行。通过在变量之前插入'__bridge'限定符,我已经取得了一些进展,但是使用下面显示的方法,尝试转换为ARC后出现以下错误:“error:Incompatible types cast'NSString __strong *'到'CFTypeRef *'(aka'const void **)用__bridge cast“。我该如何制作一个可接受的指向'actionDescription'缓冲区的指针,以便将其内容重新改写为NSString?ARC不兼容类型铸造
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element {
NSString * actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, (__bridge CFStringRef *)&actionDescription);
return actionDescription;
//return [actionDescription autorelease];
}
有趣的问题。
在ARC中,当您指定变量的引用时,ARC需要知道如何处理变量的前一个值。如果变量是__strong
那么旧的参考需要被释放,如果它是__unsafe_unretained
它可以丢弃旧的参考等等。所有这些都发生在大多数时间,而不需要你担心。
当您将指针传递给包含引用的变量时,它会变得更复杂一点,ARC需要知道指向变量的限定符。 Objective-C使用一种称为的技术,通过写回,这可能涉及使用隐藏的临时变量来确保它们都正常工作,详情请参阅Objective-C Automatic Reference Counting。核心基金会没有与此相同的内容,这就是阻碍你的转换的原因。
的解决方案是将一个指针传递到核心基础类型的变量,然后转移到Objective-C和ARC的呼叫后的功能:
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element
{
CFStringRef actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription);
return (__bridge_transfer NSString *)actionDescription;
}
使用注意事项的__bridge_transfer
- 的Copy
在函数名称指示返回的CFStringRef
由调用者拥有,必须在使用后释放,__bridge_transfer
将该所有权交给ARC,然后由ARC负责释放引用。
HTH
感谢您的解决方案和解释,但很明显,我是在我的头上。 – Antony 2014-12-06 16:04:13