2012-01-20 24 views
0

我使用JSON在應用程序中實現Facebook,我只是讓我的代碼對ARC友好。然而,當我做線,如這一個適應ARC的JSON

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); 

有誰知道我怎麼會端口ARC使用JSON框架?

+0

哪個JSON框架?爲什麼不把這個代碼從ARC中排除? –

+1

或者,如果你要去ARC,那麼爲什麼不使用NSJSONSerialization?這隻會讓你失去4.3的支持。 – Tommy

+0

我試圖從ARC中排除它,但後來我的Facebook API崩潰。如果我打算使用NSJSONSerialization,我需要自己解析還是已經存在?我不一定會喜歡重寫我已有的功能。 NSJSONSerialization如何工作? –

回答

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中找到。