Objective-C não possui namespaces; é muito parecido com C, tudo está dentro de um espaço para nome global. A prática comum é prefixar as classes com as iniciais; por exemplo, se você estiver trabalhando na IBM, poderá prefixá-las com "IBM"; se você trabalha na Microsoft, pode usar "MS"; e assim por diante. Às vezes, as iniciais se referem ao projeto, por exemplo, o Adium prefixa as classes com "AI" (como não há nenhuma empresa por trás disso, você pode pegar as iniciais). A Apple prefixa as classes com o NS e diz que esse prefixo é reservado apenas para a Apple.
Até aqui tudo bem. Mas anexar 2 a 4 letras a um nome de classe na frente é um espaço para nome muito, muito limitado. Por exemplo, MS ou AI podem ter significados completamente diferentes (AI pode ser Inteligência Artificial, por exemplo) e algum outro desenvolvedor pode decidir usá-los e criar uma classe com o mesmo nome. Bang , colisão de namespace.
Ok, se essa é uma colisão entre uma de suas próprias classes e uma de uma estrutura externa que você está usando, você pode facilmente mudar o nome da sua classe, não é grande coisa. Mas e se você usar duas estruturas externas, ambas para as quais você não tem a fonte e para as quais não pode mudar? Seu aplicativo é vinculado a ambos e você obtém conflitos de nome. Como você resolveria isso? Qual é a melhor maneira de contorná-los de tal maneira que você ainda possa usar as duas classes?
Em C, você pode solucionar esses problemas não vinculando diretamente à biblioteca; em vez disso, carrega a biblioteca em tempo de execução, usando dlopen (), encontre o símbolo que procura usando dlsym () e atribua-o a um símbolo global (que você pode nomear como quiser) e acessá-lo através deste símbolo global. Por exemplo, se você tiver um conflito porque alguma biblioteca C possui uma função chamada open (), você pode definir uma variável chamada myOpen e apontar para a função open () da biblioteca, portanto, quando desejar usar o sistema open () , você apenas usa open () e quando deseja usar o outro, acessa-o através do identificador myOpen.
Existe algo semelhante possível no Objective-C e, caso contrário, existe alguma outra solução inteligente e complicada que você possa usar para resolver conflitos de namespace? Alguma ideia?
Atualizar:
Apenas para esclarecer isso: respostas que sugerem como evitar colisões com espaço para nome antecipadamente ou como criar um espaço para nome melhor são certamente bem-vindas; no entanto, não os aceitarei como resposta, pois eles não resolvem o meu problema. Eu tenho duas bibliotecas e seus nomes de classe colidem. Eu não posso mudá-los; Eu não tenho a fonte de nenhum dos dois. A colisão já está lá e dicas sobre como poderia ter sido evitada com antecedência não ajudarão mais. Posso encaminhá-los aos desenvolvedores dessas estruturas e espero que eles escolham um espaço para nome melhor no futuro, mas, por enquanto, estou procurando uma solução para trabalhar com as estruturas agora mesmo em um único aplicativo. Alguma solução para tornar isso possível?