Cocoa 电弧不相容型铸造
我使用的是从苹果有用的UIElementUtilities应用程序中借用的核心基础方法。问题是,我希望更新这个借用的方法,使其在苹果新的自动参考计数(ARC)系统下运行。通过在变量之前插入“\u bridge”限定符,我在适应大多数借用的方法方面取得了一些进展,但是使用下面所示的方法,在尝试转换为ARC后,我得到了以下错误:“错误:不兼容的类型使用\u bridge cast将“NSString”\u strong*”转换为“CFTypeRef*”(也称为“const void**)并转换为“\u bridge cast”。如何使“actionDescription”缓冲区成为可接受的指针,以便将其内容重铸为NSStringCocoa 电弧不相容型铸造,cocoa,automatic-ref-counting,foundation,Cocoa,Automatic Ref Counting,Foundation,我使用的是从苹果有用的UIElementUtilities应用程序中借用的核心基础方法。问题是,我希望更新这个借用的方法,使其在苹果新的自动参考计数(ARC)系统下运行。通过在变量之前插入“\u bridge”限定符,我在适应大多数借用的方法方面取得了一些进展,但是使用下面所示的方法,在尝试转换为ARC后,我得到了以下错误:“错误:不兼容的类型使用\u bridge cast将“NSString”\u strong*”转换为“CFTypeRef*”(也称为“const void**)并转换为“\
+ (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需要知道如何处理变量的上一个值。如果变量是\uuu strong
,则需要释放旧引用,如果变量是\uuu不安全的\uu未恢复的
,则可以丢弃旧引用,等等。大多数情况下都会发生,而无需担心
当您传递一个指向包含引用的变量的指针时,它会变得有点复杂,ARC需要知道指向的变量上的限定符。Objective-C使用一种称为“通过写回传递”的技术,该技术可以使用隐藏的临时变量来确保所有变量都正常工作,有关详细信息,请参阅。核心基础没有这个等价物,这就是绊倒你的转换。
解决方案是将函数指针传递给核心基础类型变量,然后调用调用ObjtoFe C和ARC调用:
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element
{
CFStringRef actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription);
return (__bridge_transfer NSString *)actionDescription;
}
注意使用\uuu bridge\u transfer
-函数名中的副本
表示返回的CFStringRef
归调用方所有,使用后必须释放,\uu bridge\u transfer
将所有权交给ARC,ARC随后将负责释放引用
这是一个有趣的问题
在ARC中,将引用指定给变量时,ARC需要知道如何处理变量的上一个值。如果变量是\uuu strong
,则需要释放旧引用,如果变量是\uuu不安全的\uu未恢复的
,则可以丢弃旧引用,等等。大多数情况下都会发生,而无需担心
当您传递一个指向包含引用的变量的指针时,它会变得有点复杂,ARC需要知道指向的变量上的限定符。Objective-C使用一种称为“通过写回传递”的技术,该技术可以使用隐藏的临时变量来确保所有变量都正常工作,有关详细信息,请参阅。核心基础没有这个等价物,这就是绊倒你的转换。
解决方案是将函数指针传递给核心基础类型变量,然后调用调用ObjtoFe C和ARC调用:
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element
{
CFStringRef actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription);
return (__bridge_transfer NSString *)actionDescription;
}
注意使用\uuu bridge\u transfer
-函数名中的副本
表示返回的CFStringRef
归调用方所有,使用后必须释放,\uu bridge\u transfer
将所有权交给ARC,ARC随后将负责释放引用
这是一个有趣的问题
在ARC中,将引用指定给变量时,ARC需要知道如何处理变量的上一个值。如果变量是\uuu strong
,则需要释放旧引用,如果变量是\uuu不安全的\uu未恢复的
,则可以丢弃旧引用,等等。大多数情况下都会发生,而无需担心
当您传递一个指向包含引用的变量的指针时,它会变得有点复杂,ARC需要知道指向的变量上的限定符。Objective-C使用一种称为“通过写回传递”的技术,该技术可以使用隐藏的临时变量来确保所有变量都正常工作,有关详细信息,请参阅。核心基础没有这个等价物,这就是绊倒你的转换。
解决方案是将函数指针传递给核心基础类型变量,然后调用调用ObjtoFe C和ARC调用:
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element
{
CFStringRef actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription);
return (__bridge_transfer NSString *)actionDescription;
}
注意使用\uuu bridge\u transfer
-函数名中的副本
表示返回的CFStringRef
归调用方所有,使用后必须释放,\uu bridge\u transfer
将所有权交给ARC,ARC随后将负责释放引用
这是一个有趣的问题
在ARC中,将引用指定给变量时,ARC需要知道如何处理变量的上一个值。如果变量是\uuu strong
,则需要释放旧引用,如果变量是\uuu不安全的\uu未恢复的
,则可以丢弃旧引用,等等。大多数情况下都会发生,而无需担心
当您传递一个指向包含引用的变量的指针时,它会变得有点复杂,ARC需要知道指向的变量上的限定符。Objective-C使用一种称为“通过写回传递”的技术,该技术可以使用隐藏的临时变量来确保所有变量都正常工作,有关详细信息,请参阅。核心基础没有这个等价物,这就是绊倒你的转换。
解决方案是将函数指针传递给核心基础类型变量,然后调用调用ObjtoFe C和ARC调用:
+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element
{
CFStringRef actionDescription = nil;
AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription);
return (__bridge_transfer NSString *)actionDescription;
}
注意使用\uuu bridge\u transfer
-函数名中的副本
表示返回的CFStringRef
归调用方所有,使用后必须释放,\uu bridge\u transfer
将所有权交给ARC,ARC随后将负责释放引用
HTH谢谢你这么说