Objective-C no tiene espacios de nombres; es muy parecido a C, todo está dentro de un espacio de nombres global. La práctica común es prefijar las clases con iniciales, por ejemplo, si está trabajando en IBM, podría prefijarlas con "IBM"; si trabaja para Microsoft, puede usar "MS"; y así. A veces las iniciales se refieren al proyecto, por ejemplo, las clases de prefijos de Adium con "AI" (ya que no hay ninguna compañía detrás de eso, podría tomar las iniciales). Apple clasifica los prefijos con NS y dice que este prefijo está reservado solo para Apple.
Hasta ahora todo bien. Pero agregar de 2 a 4 letras al nombre de una clase en frente es un espacio de nombres muy, muy limitado. Por ejemplo, MS o AI podrían tener significados completamente diferentes (AI podría ser Inteligencia Artificial, por ejemplo) y algún otro desarrollador podría decidir usarlos y crear una clase con el mismo nombre. Bang , colisión de espacio de nombres.
De acuerdo, si se trata de una colisión entre una de sus propias clases y una de un marco externo que está utilizando, puede cambiar fácilmente el nombre de su clase, no es gran cosa. Pero, ¿qué sucede si usa dos marcos externos, ambos marcos para los que no tiene la fuente y que no puede cambiar? Su aplicación se vincula con ambos y obtiene conflictos de nombres. ¿Cómo harías para resolver esto? ¿Cuál es la mejor manera de evitarlos de tal manera que aún pueda usar ambas clases?
En C puede solucionar estos problemas al no vincular directamente a la biblioteca, en su lugar, cargar la biblioteca en tiempo de ejecución, usar dlopen (), luego encontrar el símbolo que está buscando usando dlsym () y asignarlo a un símbolo global (que usted puede nombrar de la forma que desee) y luego acceder a él a través de este símbolo global. Por ejemplo, si tiene un conflicto porque alguna biblioteca C tiene una función llamada open (), puede definir una variable llamada myOpen y hacer que apunte a la función open () de la biblioteca, por lo tanto, cuando desee usar el sistema open () , solo usa open () y cuando desea usar el otro, accede a él a través del identificador myOpen.
¿Es posible algo similar en Objective-C? Si no, ¿hay alguna otra solución inteligente y difícil que pueda usar para resolver conflictos de espacio de nombres? ¿Algunas ideas?
Actualizar:
Solo para aclarar esto: las respuestas que sugieren cómo evitar las colisiones del espacio de nombres por adelantado o cómo crear un mejor espacio de nombres son ciertamente bienvenidas; sin embargo, no los aceptaré como respuesta ya que no resuelven mi problema. Tengo dos bibliotecas y sus nombres de clase chocan. No puedo cambiarlos. No tengo la fuente de ninguno de los dos. La colisión ya está allí y los consejos sobre cómo podría haberse evitado de antemano ya no ayudarán. Puedo reenviarlos a los desarrolladores de estos marcos y espero que elijan un mejor espacio de nombres en el futuro, pero por el momento estoy buscando una solución para trabajar con los marcos en este momento dentro de una sola aplicación. ¿Alguna solución para hacer esto posible?