Objective c 为ARC调整JSON
我使用JSON在应用程序中实现Facebook,我只是让我的代码变得友好。然而,当我做出这样的一行时Objective c 为ARC调整JSON,objective-c,ios,xcode,automatic-ref-counting,Objective C,Ios,Xcode,Automatic Ref Counting,我使用JSON在应用程序中实现Facebook,我只是让我的代码变得友好。然而,当我做出这样的一行时 CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1); 变成 CFStringAppendCharacters((__bridge CFMutableStringRef)json, &uc, 1); 我的应用程序无法再提取我的相册(我允许用户登录Facebook,然后显示他的相册,以便他/她获取一张照片供以后在应
CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1);
变成
CFStringAppendCharacters((__bridge CFMutableStringRef)json, &uc, 1);
我的应用程序无法再提取我的相册(我允许用户登录Facebook,然后显示他的相册,以便他/她获取一张照片供以后在应用程序中使用)
这是ARC不欣赏的全部代码-(有人能给我一个如何桥接它的提示吗?)
有人知道我如何移植JSON框架供ARC使用吗?我在你的评论中看到,你刚刚决定采用
NSJSONSerialization
,这肯定会奏效。但要真正回答你的问题
考虑到所涉及的内存管理,使用\u桥
cast很容易\uu bridge
只进行强制转换,不需要为您执行任何内存管理操作<代码>\u桥接\u传输也会强制转换,但它会减少正在强制转换的对象的保留计数。考虑到这一点,您的函数调用可以分解如下:
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);
注意,这种方法仍然不那么可靠。更完整的解决方案可以在。哪个JSON框架?为什么不从ARC中排除这段代码呢?或者,如果要使用ARC,为什么不使用NSJSONSerialization呢?你只会失去4.3支持。我试图将其从ARC中排除,但后来我的Facebook API崩溃了。如果我要使用NSJSONSerialization,我需要自己进行解析吗,还是已经完成了?我不一定要重写我已经拥有的功能。NSJSONSerialization是如何工作的?检查并查看最新的Facebook SDK(内置SBJSON库)是否与ARC兼容。NSJSONSerialization为您进行解析,并内置到Cocoa中。这可能是个不错的选择。
NSString* escaped_value = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef)value,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);