Адаптация JSON для ARC - PullRequest
       3

Адаптация JSON для ARC

0 голосов
/ 21 января 2012

Я использую 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 голосов
/ 21 января 2012

Я вижу в вашем комментарии, что вы только что решили использовать 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.

Теперь, когда вы видите, что происходит, вы можете безопасно сложить вызовы так:что этот метод все еще не настолько надежен.Более полное решение можно найти в ответе Дейва Делонга на этот вопрос .

...