gpt4 book ai didi

cocoa - ARC 不兼容类型类型转换

转载 作者:行者123 更新时间:2023-12-03 17:38:50 25 4
gpt4 key购买 nike

我正在使用从 Apple 有用的 UIElementUtilities 应用程序借用的 Core Foundations 方法。问题是我希望更新这个借用的方法,以便它在Apple新的自动引用计数(ARC)系统下运行。通过在变量之前插入 '__bridge' 限定符,我在适应大多数借用方法方面取得了一些进展,但是使用下面所示的方法,在尝试转换为 ARC 后出现以下错误:“错误:不兼容的类型转换 'NSString __strong *'到'CFTypeRef *'(又名'const void **)并带有 __bridge 转换”。如何创建一个指向“actionDescription”缓冲区的可接受的指针,以便将其内容重新转换为 NSString?

+ (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 使用一种名为“pass-by-writeback”的技术,该技术可能涉及使用隐藏的临时变量来确保一切正常工作,有关详细信息,请参阅 Objective-C Automatic Reference Counting 。 Core Foundation 没有类似的功能,这就是阻碍您转换的原因。

解决方案是向函数传递一个指向 Core Foundation 类型变量的指针,然后在调用后传递给 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

关于cocoa - ARC 不兼容类型类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27303450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com