0

我有一个通过 FTP 下载的 NSMutableArray。数组中的元素是类型为 CFStringRef 的CFFTPStream 资源常量

我想从“kCFFTPResourceName”常量创建一个字符串。然而,作为 Objective C 和 iphone 开发的新手,我正在苦苦挣扎。

我所做的一切都导致 ARC 出现错误或错误,例如:

2013-01-03 15:31:44.874 Street Light Reporter[1382:11603] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930
2013-01-03 15:31:44.875 Street Light Reporter[1382:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930'

我最近的尝试是:CFStringRef *c = [ar objectAtIndex:4]; 由于以下两个原因,这不起作用:

Incompatible pointer types initializing 'CFStringRef *' (aka 'const struct __CFString **') with an expression of type 'id'

Implicit conversion of an Objective-C pointer to 'CFStringRef *' (aka 'const struct __CFString **') is disallowed with ARC

我已经尝试过各种类型转换和弄乱 (__bridge) 之类的东西,但我没有运气。

有人可以帮我吗?任何帮助将不胜感激。

4

3 回答 3

5

CFStringRef 已经是一个指针,你不需要星号。此外,您可以将 CFStringRef 转换为 NSString ,它会正常工作并且更容易使用。这称为免费桥接。如果您仍然需要 CFStringRef:

弧:

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]);

非弧

CFStringRef c = (CFStringRef)([ar objectAtIndex:4]);
于 2013-01-03T20:50:23.290 回答
3

您在这里有两个错误:第一个也是最严重的错误是您的ar对象NSDictionary不是 a NSArray。这就是为什么表演

CFStringRef *c = [ar objectAtIndex:4];

你得到一个NSInvalidArgumentException. objectAtIndex:NSArray您发送到NSdictionary实例的方法。

第二个错误是演员表。正如费尔南多已经指出的那样,您需要使用__bridge如下关键字对其进行转换。

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]);

这样 ARC 就会知道您现在将该对象视为 C 指针。

另请注意,CFStringRef定义为

typedef const struct __CFString * CFStringRef;

所以它已经是一个指针,你必须摆脱*.

于 2013-01-03T21:06:37.107 回答
1

似乎你得到了一个 CFDictionary 而不是一个数组。您链接到的常量是字典的键,您可以使用它们访问值。

于 2013-01-03T20:58:58.920 回答