Как преобразовать CFStringRef в NSString?

Последняя версия Cassandra (3.11.3) поддерживает OpenJDK8 . Итак, у вас есть альтернатива Oracle Java.

165
задан sorin 12 January 2010 в 08:49
поделиться

4 ответа

NSString и CFStringRef "Беспошлинные соединенный мостом", означая, что можно просто преобразовать тип между ними.

Например:

CFStringRef aCFString = (CFStringRef)aNSString;

работы отлично и прозрачно. Аналогично:

NSString *aNSString = (NSString *)aCFString;

Предыдущий синтаксис был для MRC. При использовании ARC новый синтаксис кастинга следующие:

NSString *aNSString = (__bridge NSString *)aCFString;

работы также. Ключевая вещь отметить состоит в том, что CoreFoundation будет часто возвращать объекты с +1 подсчетом ссылок, подразумевая, что они должны быть выпущены (все CF [Тип] Создают функции формата, делают это).

Хорошая вещь состоит в том, что в Какао можно безопасно использовать автовыпуск или выпустить для освобождения их.

346
ответ дан pasawaya 23 November 2019 в 21:07
поделиться

Я добавлю, что мало того, что можно пойти от CFString до NSString только с преобразованием типа, но это работает другой путь также. Можно отбросить эти CFStringCreateWithCString сообщение, которое является тем меньше вещи, которую необходимо выпустить позже. (Использование CF Create, где Какао использует alloc, так так или иначе, необходимо было бы выпустить его.)

получающийся код:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
3
ответ дан Jonathan. 23 November 2019 в 21:07
поделиться

Они эквивалентны, таким образом, можно просто бросить CFStringRef:

NSString *aNSString = (NSString*)aCFString;

Для большего количества информации посмотрите Бесплатные Соединенные мостом Типы.

12
ответ дан Martin Cote 23 November 2019 в 21:07
поделиться

На самом деле, вы не должны использовать сохранение, выпуск, автозапуск какао для объектов Core Foundation в целом. Если вы используете сборку мусора (на данный момент только в Mac OS X), вызовы keep, release и autorelease не работают. Отсюда утечки памяти.

Из Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :

Важно понимать асимметрию между Core Foundation и Какао - где сохранение, выпуск и автозапуск запрещены. Если, например, вы сбалансировали CFCreate… с выпуском или автоматическим выпуском, вы произведете утечку объекта в среде со сборкой мусора:

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

И наоборот, использование CFRelease для освобождения объекта, который вы ранее сохранили с помощью сохранения, приведет к подсчету ссылок ошибка недополнения.


PS: похоже, не могу комментировать ответ Питера Хози - извините за добавление моего собственного без необходимости.

4
ответ дан 23 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: