Objective-C не має просторів імен; це майже як C, все знаходиться в одному глобальному просторі імен. Поширена практика полягає в префіксації класів з ініціалами, наприклад, якщо ви працюєте в IBM, ви можете префіксувати їх за допомогою "IBM"; якщо ви працюєте в Microsoft, ви можете використовувати "MS"; і так далі. Іноді ініціали посилаються на проект, наприклад, клас префіксів Adium з "AI" (оскільки за ним не стоїть компанія, яку ви могли взяти ініціали). Префікси Apple класів із NS та кажуть, що цей префікс зарезервований лише для Apple.
Поки що добре. Але додавання 2 - 4 букв до імені класу спереду - це дуже, дуже обмежений простір імен. Наприклад, MS або AI можуть мати зовсім інші значення (AI може бути штучним інтелектом, наприклад), а деякі інші розробники можуть вирішити використовувати їх і створити клас з однаковою назвою. Вибух , зіткнення простору імен.
Гаразд, якщо це зіткнення одного з ваших власних класів та одного із зовнішніх рамок, якими ви користуєтесь, ви можете легко змінити іменування свого класу, без особливих зусиль. Але що робити, якщо ви використовуєте дві зовнішні рамки, обидві рамки, для яких у вас немає джерела, і які ви не можете змінити? Ваша програма зв’язується з обома, і ви отримуєте конфлікти імен. Як би ви вирішили це вирішити? Який найкращий спосіб обійти їх таким чином, що ви все ще можете використовувати обидва класи?
У C ви можете обійти їх, не посилаючись безпосередньо на бібліотеку, замість цього завантажуйте бібліотеку під час виконання, використовуючи dlopen (), потім знайдіть потрібний символ, використовуючи dlsym (), і призначте його глобальному символу (що ви можна назвати будь-який спосіб, який вам подобається), а потім отримати доступ до нього через цей глобальний символ. Наприклад, якщо у вас конфлікт, оскільки деяка бібліотека C має функцію з назвою open (), ви можете визначити змінну з назвою myOpen і вказати її на функцію open () бібліотеки, таким чином, коли ви хочете використовувати систему open () , ви просто використовуєте open (), і коли ви хочете використовувати інший, ви отримуєте доступ до нього через ідентифікатор myOpen.
Чи можливо щось подібне в Objective-C, а якщо ні, чи є якесь інше розумне, хитре рішення, яке ви можете використовувати для вирішення конфліктів у просторі імен? Будь-які ідеї?
Оновлення:
Просто для уточнення цього: відповіді, які підказують, як заздалегідь уникнути зіткнень у просторі імен або як створити кращу область імен, безумовно, вітаються; однак я не прийму їх як відповідь, оскільки вони не вирішують моєї проблеми. У мене дві бібліотеки і назви їхніх класів стикаються. Я не можу їх змінити; У мене немає джерела жодного. Зіткнення вже існує, і поради про те, як його можна було заздалегідь уникнути, вже не допоможуть. Я можу переслати їх розробникам цих фреймворків і сподіваюся, що вони виберуть кращу область імен у майбутньому, але поки я шукаю рішення для роботи з фреймворками прямо зараз в рамках однієї програми. Будь-які рішення, щоб зробити це можливим?