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.
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.
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 CFStringCreateWithCStringmensagem, que é uma coisa a menos que precisa liberar mais tarde. (O CF usa Createonde o cacau usaalloc , então, de qualquer forma, você precisaria liberá-lo.)
Eu estava tendo um problema com o ARC e a contagem de retenção de CFStrings. Usar a resposta do NilObjects com um pequeno ajuste funcionou perfeitamente para mim. Acabei de adicionar retidos, por exemplo.
Se você estiver usando o ARC em versões recentes do Mac OS X / Objective C, é muito fácil:
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.
fonte
(__bridge NSString *)
é suficiente: não faz sentido aumentar a contagem de retençõesCFBridgingRelease()
.Eles são equivalentes, então você pode simplesmente converter o CFStringRef:
Para obter mais informações, consulte Tipos de pontes gratuitas .
fonte
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.
Da Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html :
É 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:
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.
fonte
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 usaCreate
onde o cacau usaalloc
, então, de qualquer forma, você precisaria liberá-lo.)O código resultante:
fonte
Eu estava tendo um problema com o ARC e a contagem de retenção de CFStrings. Usar a resposta do NilObjects com um pequeno ajuste funcionou perfeitamente para mim. Acabei de adicionar retidos, por exemplo.
fonte
Você tem que lançá-lo:
fonte
Você pode usar: Com CFStringRef idc;
fonte