2012-09-05 23 views
9

Duplicar posible:
How to make an CFArrayRef to an NSMutableArrayCómo convertir CFArrayRef a NSArray?

Sé que hay tantos información sobre estas preguntas, pero cada respuestas individuales son "esto es fácil que usted puede hacer fundido como en puente de teléfono gratuito. . ", y luego no se menciona el código fuente real. Conozco el promedio de los enlaces y el cast sin cargos. Quiero saber el código fuente exacto "Cómo convertir CFArrayRef a NSArray?" . ¡Cualquier persona por favor !!!!!!

Respuesta

5

Usted debe ser capaz de echarlo:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

¡Muchas gracias! ¡Lo intentaré ahora mismo! – user1574429

+1

No necesita copiarlo. Un molde de puente gratuito es, literalmente, simplemente 'NSArray * myNsArray = (NSArray *) myCfArray;' – jjv360

+0

Eso solo funciona para código que no es ARC. –

37

Bueno, primero hay que saber si está utilizando ARC o no, debido a que las reglas cambian un poco. Luego, necesitas saber qué es lo que realmente quieres hacer con tu elenco. ¿Desea usar el valor o transferir la propiedad?

Asumiré ARC, porque, IMO, todo código nuevo realmente debería usar ARC (y ARC es donde prevalecen los problemas de conversión).

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

El código anterior arroja la referencia CF a un NSArray* que se puede utilizar en el contexto actual. No se ha producido transferencia de propiedad. someArrayRef sigue siendo su referencia, y aún debe liberar manualmente someArrayRef o se perderá.

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

En este código, no solo obtiene un elenco, sino una transferencia de propiedad. someArrayRef ahora ya no contiene la referencia, por lo que no necesita ser liberado manualmente. En cambio, cuando se libera array, el objeto se destrabará (suponiendo que no haya otras referencias en otros lugares).

+0

Parece que CFBridgingRelease es el camino a seguir en el entorno ARC. Siempre transfiere a NS ... y usa CFBridgingRelease –