适应ARC的JSON

时间:2012-01-20 22:59:15

标签: objective-c ios xcode automatic-ref-counting

我使用JSON在应用程序中实现Facebook,而我只是使我的代码对ARC友好。但是,当我制作像这样的行

CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1);

成为

CFStringAppendCharacters((__bridge CFMutableStringRef)json, &uc, 1);

我的应用程序无法再拉出我的相册(我允许用户登录Facebook,然后我会显示他的相册,以便他/她获取图片以便以后在应用中使用)。

这是ARC不理解的整个代码 - (有人可以给我一个提示如何桥接它吗?)

NSString* escaped_value = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                              NULL, /* allocator */
                              (CFStringRef)value,
                              NULL, /* charactersToLeaveUnescaped */
                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                              kCFStringEncodingUTF8);

有谁知道如何移植JSON框架以供ARC使用?

1 个答案:

答案 0 :(得分:0)

我在你的评论中看到你刚刚决定选择NSJSONSerialization,这肯定会奏效。但要真正回答你的问题。

当您考虑所涉及的内存管理时,使用__bridge强制转换很容易。 __bridge只是在没有为您进行任何内存管理操作的情况下进行投射; __bridge_transfer也会强制转换,但会减少正在投放的对象的保留计数。因此,考虑到这一点,您的函数调用可以这样分解:

CFStringRef originalValue = (__bridge CFStringRef)value;// Only __bridge required because ownership not changing
CFStringRef escapeChars = (CFStringRef)@"!*'();:@&=+$,/?%#[]";// __bridge not required for string literal
CFStringRef escaped_CFString = CFURLCreateStringByAddingPercentEscapes(NULL, originalValue, NULL, escapeChars, kCFStringEncodingUTF8);// returns a CFStringRef that YOU own.
NSString *escaped_value = (__bridge_transfer NSString *)escaped_CFString; // __bridge_transfer tells the compiler to send a release call to escaped_CFString.

现在您已经看到发生了什么,您可以安全地堆叠这样的呼叫:

NSString* escaped_value = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef)value,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);

请注意,此方法仍然不可靠。可以在Dave DeLong's answer to this question中找到更完整的解决方案。