将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型

Posted

技术标签:

【中文标题】将 \'NSString *\' 转换为 \'CTStringRef *\' 的不兼容类型【英文标题】:Incompatible types casting 'NSString *' to 'CTStringRef *'将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型 【发布时间】:2015-04-14 20:40:41 【问题描述】:

我只是想将 NSString* 转换为 CTStringRef*

    NSString *foobar = @"foobar";
    CFStringRef *tmp = (__bridge_retained CFStringRef*)foobar;

有人可以帮助解决这个错误吗? "不兼容的类型将 'NSString *' 转换为 'CTStringRef *' (aka const struct __CFString **) with a __bridge_retained cast"

我已经尝试过简单的 __bridge,但它也不起作用。从文档中,我认为 _retained 是我需要的正确类型。 谢谢。

【问题讨论】:

NSString to CFStringRef and CFStringRef to NSString in ARC? 的可能重复项 请用谷歌搜索你的问题,很难吗? @luk2303,这并不难。我确实看到了其他帖子,但是该线程中的解决方案对我不起作用。让我解释一下:我知道删除 * 可以解决错误,但仍然存在警告......因此,我可能做错了其他事情。寻求帮助。 【参考方案1】:

如果您仔细查看错误消息,您会发现问题所在。提示在这部分 -

__CFString **

注意两个 * - 这意味着您正在尝试将指针转换为指向指针的指针,或者换句话说,是对引用的引用。 CTStringRef 已经是一个引用,正如名称的“Ref”部分所暗示的那样,因此您不需要 (__bridge_retained CFStringRef*) 中的 *

你的代码应该是这样的

NSString *foobar = @"foobar";
CFStringRef tmp = (__bridge_retained CFStringRef)foobar;

【讨论】:

您的意思是 CFStringRef tmp,而不是 CFStringRef *tmp。 谢谢。错过了一个:) 删除 * 修复了错误,但现在出现警告:'不兼容的指针类型正在初始化 'CFStringRef *' (aka 'const struct __CFStringRef **') 与 CFStringRef 类型的表达式 (aka 'const struct __CFStringRef *')

以上是关于将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型的主要内容,如果未能解决你的问题,请参考以下文章

将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型

如何将 NSUInteger 转换为 NSString?

无法将 NSString 转换为 NSURL

如果将一个NSObject从NSDictionary转换为NSString?

将 NSData 转换为 NSString 并再次转换为 NSData?

如何将 std::string 转换为 NSString?