Objective-C n'a pas d'espaces de noms; c'est un peu comme C, tout est dans un espace de noms global. La pratique courante est de préfixer les classes avec des initiales, par exemple si vous travaillez chez IBM, vous pouvez les préfixer avec "IBM"; si vous travaillez pour Microsoft, vous pouvez utiliser "MS"; etc. Parfois, les initiales font référence au projet, par exemple Adium préfixe les classes avec "AI" (car il n'y a pas de société derrière cela, vous pouvez prendre les initiales). Apple préfixe les classes avec NS et indique que ce préfixe est réservé à Apple uniquement.
Jusqu'ici tout va bien. Mais ajouter 2 à 4 lettres à un nom de classe devant est un espace de noms très, très limité. Par exemple, MS ou AI pourrait avoir une signification entièrement différente (l'IA pourrait être une intelligence artificielle par exemple) et un autre développeur pourrait décider de les utiliser et de créer une classe également nommée. Bang , collision d'espace de noms.
D'accord, s'il s'agit d'une collision entre l'une de vos propres classes et l'un des frameworks externes que vous utilisez, vous pouvez facilement changer le nom de votre classe, ce n'est pas grave. Mais que faire si vous utilisez deux frameworks externes, les deux frameworks dont vous n'avez pas la source et que vous ne pouvez pas changer? Votre application est liée aux deux et vous obtenez des conflits de noms. Comment allez-vous résoudre ces problèmes? Quelle est la meilleure façon de les contourner de manière à pouvoir toujours utiliser les deux classes?
En C, vous pouvez contourner ces problèmes en ne liant pas directement à la bibliothèque, à la place vous chargez la bibliothèque au moment de l'exécution, en utilisant dlopen (), puis trouvez le symbole que vous recherchez en utilisant dlsym () et affectez-le à un symbole global (que vous pouvez nommer comme vous le souhaitez), puis accédez-y via ce symbole global. Par exemple, si vous avez un conflit parce qu'une bibliothèque C a une fonction nommée open (), vous pouvez définir une variable nommée myOpen et la faire pointer vers la fonction open () de la bibliothèque, donc lorsque vous souhaitez utiliser le système open () , il vous suffit d'utiliser open () et lorsque vous souhaitez utiliser l'autre, vous y accédez via l'identifiant myOpen.
Quelque chose de similaire est-il possible en Objective-C et sinon, existe-t-il une autre solution intelligente et délicate que vous pouvez utiliser pour résoudre les conflits d'espace de noms? Des idées?
Mettre à jour:
Juste pour clarifier ceci: les réponses qui suggèrent comment éviter les collisions d'espace de noms à l'avance ou comment créer un meilleur espace de noms sont certainement les bienvenues; cependant, je ne les accepterai pas comme réponse car ils ne résolvent pas mon problème. J'ai deux bibliothèques et leurs noms de classe se heurtent. Je ne peux pas les changer; Je n'ai pas la source de l'un ou l'autre. La collision est déjà là et des conseils sur la façon dont elle aurait pu être évitée à l'avance ne seront plus utiles. Je peux les transmettre aux développeurs de ces frameworks et espérer qu'ils choisiront un meilleur espace de noms à l'avenir, mais pour le moment, je recherche une solution pour travailler avec les frameworks dès maintenant dans une seule application. Des solutions pour rendre cela possible?