2014-12-04 39 views
0

我正在使用从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]; 

}

回答

1

有趣的问题。

在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

+0

感谢您的解决方案和解释,但很明显,我是在我的头上。 – Antony 2014-12-06 16:04:13