Respostas:
NSString e CFStringRef são "pontes gratuitas", o que significa que você pode simplesmente alternar entre elas.
Por exemplo:
CFStringRef aCFString = (CFStringRef)aNSString;
funciona de forma perfeita e transparente. Da mesma forma:
NSString *aNSString = (NSString *)aCFString;
A sintaxe anterior era para MRC. Se você estiver usando o ARC, a nova sintaxe de conversão é a seguinte:
NSString *aNSString = (__bridge NSString *)aCFString;
funciona também. O ponto principal a ser observado é que o CoreFoundation geralmente retorna objetos com contagem de referência +1, o que significa que eles precisam ser liberados (todas as funções de formato CF [Tipo] Criar fazem isso).
O bom é que, no Cocoa, você pode usar com segurança o lançamento automático ou a liberação para liberá-los.
Se você estiver usando o ARC em versões recentes do Mac OS X / Objective C, é muito fácil:
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
No entanto, o Xcode avisará com prazer quando você tentar ligar gratuitamente a CFString para a NSString e oferecer a quebra automática em CFBridgingRelease (), que você pode aceitar e permitir que ele insira automaticamente o invólucro se você clicar na opção.
(__bridge NSString *)
é suficiente: não faz sentido aumentar a contagem de retenções CFBridgingRelease()
.
Eles são equivalentes, então você pode simplesmente converter o CFStringRef:
NSString *aNSString = (NSString*)aCFString;
Para obter mais informações, consulte Tipos de pontes gratuitas .
Na verdade, você não deve usar Cocoa reter, liberar, liberar automaticamente em objetos do Core Foundation em geral. Se você estiver usando a Garbage Collection (apenas no Mac OS X por enquanto), as chamadas retidas, liberadas e liberadas automaticamente são todas sem opção. Daí vazamentos de memória.
É importante apreciar a assimetria entre a Core Foundation e o Cocoa - onde reter, liberar e liberar automaticamente não são ops. Se, por exemplo, você equilibrou um CFCreate… com liberação ou liberação automática, vazará o objeto em um ambiente de coleta de lixo:
NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment
Por outro lado, usar CFRelease para liberar um objeto que você reteve anteriormente usando reter resultará em um erro de fluxo insuficiente de contagem de referência.
PS: parece que não consigo comentar a resposta de Peter Hosey - desculpe-me por adicionar a minha própria desnecessariamente.
Acrescentarei que não apenas você pode ir do CFString para o NSString com apenas uma conversão de tipo, mas também funciona da outra maneira. Você pode soltar a CFStringCreateWithCString
mensagem, que é uma coisa a menos que precisa liberar mais tarde. (O CF usa Create
onde o cacau usaalloc
, então, de qualquer forma, você precisaria liberá-lo.)
O código resultante:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
Você pode usar: Com CFStringRef idc;
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];