Відповіді:
NSString та CFStringRef - це "безкоштовні мости", тобто ви можете просто набрати між ними.
Наприклад:
CFStringRef aCFString = (CFStringRef)aNSString;
працює ідеально та прозоро. Аналогічно:
NSString *aNSString = (NSString *)aCFString;
Попередній синтаксис був для MRC. Якщо ви використовуєте ARC, новий синтаксис кастингу такий:
NSString *aNSString = (__bridge NSString *)aCFString;
працює також. Ключове, що слід зазначити, це те, що CoreFoundation часто повертає об'єкти з +1 посиланнями, тобто їх потрібно випустити (всі CF [Тип] Створити форматні функції роблять це).
Приємно те, що в Какао можна сміливо використовувати автовипуск або випуск, щоб звільнити їх.
Якщо ви використовуєте ARC в останніх версіях Mac OS X / Objective C, це так реальна легко:
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
Однак, Xcode з радістю попередить вас, коли ви намагатиметесь отримати безкоштовний міст CFString до NSString та запропонує автоматично обернути його у CFBridgingRelease (), який ви можете прийняти і дозволити автоматично вставити обгортку для вас, якщо натиснути цю опцію.
(__bridge NSString *)
цього достатньо: немає сенсу збільшувати кількість утримань CFBridgingRelease()
.
Вони еквівалентні, тому ви можете просто віддати CFStringRef:
NSString *aNSString = (NSString*)aCFString;
Для отримання додаткової інформації див. Безкоштовні мостові типи .
Насправді, ви не повинні використовувати Cocoa зберігати, випускати, автовипускати на об'єктах Core Foundation взагалі. Якщо ви використовуєте Garbage Collection (лише зараз на Mac OS X), ці виклики зберігати, відпускати та автоматично випускати - це не потрібно. Звідси протікає пам'ять.
Важливо оцінити асиметрію між базовим фондом та какао - там, де утримання, вивільнення та автоматичне вивільнення відсутні. Якщо, наприклад, ви врівноважили 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
, тому в будь-якому випадку вам потрібно було б його випустити.)
Отриманий код:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];