2013-01-03 32 views
0

我有一个通过FTP下载的NSMutableArray。数组中的元素是CFFTPStream resource constants,它们的类型为CFStringRef。(Objective C)从NSMutableArray获取CFstringRef

我想从“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)和诸如此类的东西乱搞,我有没有运气。

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

+0

提示:向我们展示从JSON解码器获取的对象的源JSON字符串(至少前50个字符左右)或NSLog。 –

回答

3

这里有两个错误:第一个也是最严重的一个是,您的ar对象是NSDictionary而不是NSArray。这就是为什么执行

CFStringRef *c = [ar objectAtIndex:4]; 

你得到一个NSInvalidArgumentExceptionobjectAtIndex:是您发送到NSdictionary实例的NSArray的一种方法。

第二个错误是演员。正如Fernando已经指出的那样,您需要使用__bridge关键字来投射它,如下所示。

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

使ARC会知道你现在正在治疗对象作为C指针。

还要注意CFStringRef被定义为

typedef const struct __CFString * CFStringRef; 

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

+2

非常彻底。但是,简单的'__bridge'不转让所有权;底层对象仍然由ARC管理。你需要'__bridge_retained'来承担责任。 –

+0

@JoshCaswell你是绝对正确的。我对'__bridge_transfer'感到困惑。 –

+0

我总是感到困惑。在我评论之前,我必须先查看一下。 –

5

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

ARC:

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

非圆弧

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

+1提及**可怜的被遗弃的非ARC解决方案** – 2013-01-03 20:52:21

+0

它编译,但是一旦我跨过那一行,应用程序崩溃了:终止应用程序,由于未捕获异常'NSInvalidArgumentException',原因:' - [__ NSCFDictionary objectAtIndex:]:无法识别的选择器发送到实例0x79cd1e0'' – 0nyx

+1

那么,这是因为你的“ar”是一个NSDictionary而不是一个NSArray,所以你的解析有些问题,它不在你发布的代码 –

1

看来你得到一个CFDictionary回来,而不是一个数组。 链接的常量是字典的关键字,您可以通过它访问这些值。