Objective-C non ha spazi dei nomi; è molto simile a C, tutto è all'interno di uno spazio dei nomi globale. La pratica comune è quella di aggiungere un prefisso alle classi con le iniziali, ad es. Se si lavora in IBM, è possibile prefissarle con "IBM"; se lavori per Microsoft, puoi usare "MS"; e così via. A volte le iniziali si riferiscono al progetto, ad esempio prefissi Adium classi con "AI" (in quanto non vi è alcuna compagnia dietro la quale si possano prendere le iniziali). Il prefisso Apple classifica le classi con NS e dice che questo prefisso è riservato solo ad Apple.
Fin qui tutto bene. Ma aggiungere da 2 a 4 lettere a un nome di classe davanti è uno spazio dei nomi molto, molto limitato. Ad esempio, MS o AI potrebbero avere significati completamente diversi (l'intelligenza artificiale potrebbe essere ad esempio l'intelligenza artificiale) e alcuni altri sviluppatori potrebbero decidere di usarli e creare una classe ugualmente denominata. Bang , collisione dello spazio dei nomi.
Ok, se questa è una collisione tra una delle tue classi e quella di un framework esterno che stai usando, puoi facilmente cambiare la denominazione della tua classe, senza grossi problemi. Ma cosa succede se si utilizzano due framework esterni, entrambi in cui non si dispone della fonte e che non è possibile modificare? L'applicazione si collega a entrambi e si verificano conflitti di nomi. Come faresti a risolverli? Qual è il modo migliore per aggirarli in modo tale da poter ancora utilizzare entrambe le classi?
In C puoi aggirare questi non collegandoli direttamente alla libreria, invece carichi la libreria in fase di esecuzione, usando dlopen (), quindi trova il simbolo che stai cercando usando dlsym () e assegnalo a un simbolo globale (che può nominare come preferisci) e quindi accedervi tramite questo simbolo globale. Ad esempio, se si verifica un conflitto perché una libreria C ha una funzione denominata open (), è possibile definire una variabile denominata myOpen e farla puntare alla funzione open () della libreria, quindi quando si desidera utilizzare il sistema open () , usi semplicemente open () e quando vuoi usare l'altro, accedi ad esso tramite l'identificatore myOpen.
Qualcosa di simile è possibile in Objective-C e, in caso contrario, c'è qualche altra soluzione intelligente e complicata che puoi usare per risolvere i conflitti dello spazio dei nomi? Qualche idea?
Aggiornare:
Solo per chiarire questo: le risposte che suggeriscono come evitare in anticipo le collisioni dello spazio dei nomi o come creare uno spazio dei nomi migliore sono sicuramente benvenute; tuttavia, non li accetterò come risposta poiché non risolvono il mio problema. Ho due librerie e i loro nomi di classe si scontrano. Non posso cambiarli; Non ho la fonte di nessuno dei due. La collisione è già lì e i suggerimenti su come avrebbe potuto essere evitato in anticipo non aiuteranno più. Posso inoltrarli agli sviluppatori di questi framework e spero che in futuro scelgano uno spazio dei nomi migliore, ma per ora sto cercando una soluzione per lavorare con i framework in una sola applicazione. Qualche soluzione per renderlo possibile?