работает так же. Ключевым моментом, на который следует обратить внимание, является то, что CoreFoundation часто возвращает объекты с числом ссылок +1, что означает, что они должны быть освобождены (все функции формата CF [Type] Create делают это).
Приятно то, что в Какао вы можете безопасно использовать авто-релиз или релиз, чтобы освободить их.
Тем не менее, Xcode с радостью предупредит вас, когда вы попробуете бесплатно соединить CFString с NSString, и предложит автоматически обернуть его в CFBridgingRelease (), который вы можете принять, и разрешить ему автоматически вставлять оболочку, если вы нажмете эту опцию.
На самом деле, вы не должны использовать Cocoa retain, release, autorelease для объектов Core Foundation в целом. Если вы используете сборщик мусора (пока только в Mac OS X), все вызовы retain, release, autorelease - это все no-ops. Отсюда утечки памяти.
Важно оценить асимметрию между основной основой и какао, где удержание, высвобождение и авто-релиз не допускаются. Если, например, вы сбалансировали CFCreate ... с выпуском или автоматическим выпуском, вы утечете объект в среде сбора мусора:
NSString*myString =(NSString*)CFStringCreate...(...);// do interesting things with myString...[myString release];// leaked in a garbage collected environment
И наоборот, использование CFRelease для освобождения объекта, который вы ранее сохранили, используя retain, приведет к ошибке опустошения счетчика ссылок.
PS: не могу комментировать ответ Питера Хоси - извините за добавление моего собственного излишне.
Я добавлю, что вы можете не только перейти от CFString к NSString только с приведением типа, но и работать по-другому. Вы можете отбросить CFStringCreateWithCStringсообщение, которое вам нужно выпустить позже. (CF использует, Createгде использует какаоalloc , так что в любом случае вам бы пришлось его выпустить.)
У меня была проблема с ARC и счетом сохранения CFStrings. Использование ответа NilObjects с небольшим изменением отлично сработало для меня. Я только добавил сохранил например.
Если вы используете ARC в последних версиях Mac OS X / Objective C, это реальная легко:
Тем не менее, Xcode с радостью предупредит вас, когда вы попробуете бесплатно соединить CFString с NSString, и предложит автоматически обернуть его в CFBridgingRelease (), который вы можете принять, и разрешить ему автоматически вставлять оболочку, если вы нажмете эту опцию.
источник
(__bridge NSString *)
достаточно: нет смысла увеличивать счет удержания сCFBridgingRelease()
.Они эквивалентны, так что вы можете просто привести CFStringRef:
Для получения дополнительной информации см. Бесплатные типы мостов .
источник
На самом деле, вы не должны использовать Cocoa retain, release, autorelease для объектов Core Foundation в целом. Если вы используете сборщик мусора (пока только в Mac OS X), все вызовы retain, release, autorelease - это все no-ops. Отсюда утечки памяти.
От Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
Важно оценить асимметрию между основной основой и какао, где удержание, высвобождение и авто-релиз не допускаются. Если, например, вы сбалансировали CFCreate ... с выпуском или автоматическим выпуском, вы утечете объект в среде сбора мусора:
И наоборот, использование CFRelease для освобождения объекта, который вы ранее сохранили, используя retain, приведет к ошибке опустошения счетчика ссылок.
PS: не могу комментировать ответ Питера Хоси - извините за добавление моего собственного излишне.
источник
Я добавлю, что вы можете не только перейти от CFString к NSString только с приведением типа, но и работать по-другому. Вы можете отбросить
CFStringCreateWithCString
сообщение, которое вам нужно выпустить позже. (CF использует,Create
где использует какаоalloc
, так что в любом случае вам бы пришлось его выпустить.)Полученный код:
источник
У меня была проблема с ARC и счетом сохранения CFStrings. Использование ответа NilObjects с небольшим изменением отлично сработало для меня. Я только добавил сохранил например.
источник
Вы должны разыграть это:
источник
Вы можете использовать: с CFStringRef idc;
источник