estoy empezando a trabajar en un proyecto de Objective-C++, obtener una idea de cómo la síntesis de las dos lenguas se siente antes de hacer cualquier diseño de alta resistencia. Estoy muy intrigado por la forma de conteo automatizado de referencia se ha integrado con C++: se obtiene el equivalente de punteros inteligentes para NSObjects
que se encargan de retener/liberar adecuadamente en contenedores STL (véase el artículo de David Chisnall en http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3).Cómo utilizar NSString como clave en Objective-C++ std :: mapa
Quiero usar un mapa STL como una asignación de typesafe NSStrings
a valores de C++. Puedo declarar una asignación como
std::map<NSString*, MyType> mapping
Con ARC, esta asignación maneja la administración de la memoria correctamente. Pero no sigue la semántica de valores NSString
correctamente, porque está utilizando comparaciones de punteros en lugar de -[NSString compare:]
.
Cuál es la mejor manera de conseguir un mapa de STL para usar la comparación de cadenas en lugar de la comparación puntero?
¿Debo tratar de especializarme std::less<NSString*>
?
¿Debo declarar un comparador explícito como std::map<NSString*, MyType, MyCompare>
?
¿Debo envolver los NSString*
llaves en un puntero inteligente que implementa operator<
?
¿cómo definir mejor? ¿Cuál es la memoria de velocidad de resultado deseada? – madmik3
Interesante. No tenía idea de que los punteros objc funcionarían tan fácilmente con ARC. Al mirar el artículo de Chisnall, tendrá que agregar __weak o __strong a su declaración de mapa para que funcione. De lo contrario, son POD y no funcionará. (No tengo una respuesta para el problema de la comparación porque lo hago con poca frecuencia y olvido los términos posteriores. Lo probaría en el orden que usted dio.) – smparkes
Creo que si los indicadores son fuertes, no tiene que marcarlos, solo si son débiles De todos modos, iría con un comparador explícito. – bames53