2012-01-20 2 views
0

JSON을 응용 프로그램에서 페이스 북 구현에 사용하고 코드를 쉽게 ARC에 익숙하게 만듭니다. 나는 이와 같은 라인을 때, 하나의ARC 용 JSON 적용

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

내 응용 프로그램은 더 이상 내가 사용자가 페이스 북에 로그인 할 수 있도록 (내 사진 앨범을 당길 수있다

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

을가되지 나는 그의 표시 그/그녀는 나중에 응용 프로그램에서 사용하기 위해 사진을 얻을 순서로 앨범).

이 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에서 찾을 수 있습니다.