NSString для CFStringRef и CFStringRef для NSString в ARC?

Я пытаюсь понять правильный способ получения NSString из CFStringRef в ARC? То же самое для перехода в противоположном направлении, CFStringRef в NSString в ARC?

Каков правильный способ сделать это без создания утечек памяти?

типично

 NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString; 

а также

 CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString; 

Теперь, если вы хотите знать, почему __bridge ключевое слово __bridge , вы можете обратиться к документации Apple . Там вы найдете:

__bridge передает указатель между Objective-C и Core Foundation без передачи права собственности.

__bridge_retained или CFBridgingRetain указатель Objective-C указателю Core Foundation, а также передает вам право собственности. Вы несете ответственность за вызов CFRelease или связанной функции, чтобы отказаться от владения объектом.

__bridge_transfer или CFBridgingRelease перемещает указатель не Objective-C в Objective-C, а также передает права собственности ARC. ARC отвечает за отказ от владения объектом.

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

Также может быть случай, когда вы хотите передать право собственности по какой-либо причине.

Например, рассмотрим следующий fragment

 - (void)sayHi { CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman); NSString * aNSString = (__bridge NSString *)str; NSLog(@"%@", aNSString); CFRelease(str); //you have to release the string because you created it with a 'Create' CF function } 

в таком случае вы можете сохранить CFRelease , передав право собственности при кастинге.

 - (void)sayHi { CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman); NSString * aNSString = (__bridge_transfer NSString *)str; // or alternatively NSString * aNSString = (NSString *)CFBridgingRelease(str); NSLog(@"%@", aNSString); } 

Владение str было передано, поэтому теперь ARC начнет использовать и освободит память для вас.

С другой стороны, вы можете использовать NSString * для CFString используя __bridge_retained , так что вы будете владеть объектом, и вам придется явно освободить его, используя CFRelease .


Чтобы обернуть его, вы можете

NSString → CFString

 // Don't transfer ownership. You won't have to call `CFRelease` CFStringRef str = (__bridge CFStringRef)string; // Transfer ownership (ie get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it CFStringRef str = (__bridge_retained CFStringRef)string // you will have to call `CFRelease` 

CFString → NSString

 // Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created) NSString *string = (__bridge NSString *)str; // Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str` NSString *string = (__bridge_transfer NSString *)str; 
  • Интервью: Можем ли мы создать абстрактный class?
  • C #: печать всех свойств объекта
  • Ошибка: создание общего массива
  • sizeof class с int, функцией, виртуальной функцией в C ++?
  • Разница между объектом и classом в Scala
  • Как вы получаете «ссылку на объект» объекта в java, когда toString () и hashCode () были переопределены?
  • Есть ли простой способ конвертировать метку времени ISO8601 в форматированный NSDate?
  • libxml / tree.h нет такого файла или каталога
  • Как получить доступ к первому свойству объекта в Javascript?
  • Почему нет classа java.lang.Array? Если java-массив является объектом, не должен ли он расширять Object?
  • val и объект внутри classа scala?
  • Interesting Posts

    Мягкая клавиатура Android покрывает поле edittext

    Использование команды watch с аргументом, содержащим кавычки

    Как я могу сохранить состояние своей программы и загрузить ее?

    Android FragmentManager BackStackRecord.run бросает NullPointerException

    Как скопировать настройки Chrome без их сброса?

    Какова фактическая производственная мощность (необработанная неформатированная) жесткого диска

    Vue: общие данные между разными страницами

    Проверка наличия ключа в HashMap

    Доступ к ScrollViewer из ListBox из C #

    Определение дубликатов в списке

    Android, Сделать изображение по URL-адресу, равному изображению ImageView

    Как я узнаю, действительно ли встроенная функция заменена в том месте, где она вызывается или нет?

    Группировка меток и объединение их текстовых значений (например, сводной таблицы)

    Свежая установка компьютера, но отсутствует много драйверов

    Как использовать RecyclerView внутри NestedScrollView?

    Давайте будем гением компьютера.