我使用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使用?
答案 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中找到更完整的解决方案。