Objective-C hat keine Namespaces. Es ist ähnlich wie bei C, alles befindet sich in einem globalen Namespace. Es ist üblich, Klassen mit Initialen voranzustellen. Wenn Sie beispielsweise bei IBM arbeiten, können Sie ihnen "IBM" voranstellen. Wenn Sie für Microsoft arbeiten, können Sie "MS" verwenden. und so weiter. Manchmal beziehen sich die Initialen auf das Projekt, z. B. Adium-Präfixklassen mit "AI" (da keine Firma dahinter steht, könnten Sie die Initialen nehmen). Apple stellt Klassen mit NS voran und sagt, dass dieses Präfix nur für Apple reserviert ist.
So weit so gut. Das Anhängen von 2 bis 4 Buchstaben an einen vorangestellten Klassennamen ist jedoch ein sehr, sehr begrenzter Namespace. Beispielsweise könnten MS oder KI eine völlig andere Bedeutung haben (KI könnte beispielsweise künstliche Intelligenz sein), und ein anderer Entwickler könnte sich dafür entscheiden, sie zu verwenden und eine gleichnamige Klasse zu erstellen. Bang , Namespace-Kollision.
Okay, wenn dies eine Kollision zwischen einer Ihrer eigenen Klassen und einem externen Framework ist, das Sie verwenden, können Sie die Benennung Ihrer Klasse leicht ändern, keine große Sache. Aber was ist, wenn Sie zwei externe Frameworks verwenden, beide Frameworks, für die Sie keine Quelle haben und die Sie nicht ändern können? Ihre Anwendung ist mit beiden verknüpft, und Sie erhalten Namenskonflikte. Wie würden Sie diese lösen? Was ist der beste Weg, um sie so zu umgehen, dass Sie immer noch beide Klassen verwenden können?
In C können Sie diese umgehen, indem Sie nicht direkt mit der Bibliothek verknüpfen. Stattdessen laden Sie die Bibliothek zur Laufzeit mit dlopen (), suchen das gesuchte Symbol mit dlsym () und weisen es einem globalen Symbol zu (das Sie kann beliebig benennen) und dann über dieses globale Symbol darauf zugreifen. Wenn Sie beispielsweise einen Konflikt haben, weil eine C-Bibliothek eine Funktion mit dem Namen open () hat, können Sie eine Variable mit dem Namen myOpen definieren und auf die open () -Funktion der Bibliothek verweisen lassen, wenn Sie also das System open () verwenden möchten. Verwenden Sie einfach open () und wenn Sie das andere verwenden möchten, greifen Sie über die myOpen-ID darauf zu.
Ist in Objective-C etwas Ähnliches möglich, und wenn nicht, gibt es eine andere clevere, knifflige Lösung, mit der Sie Namespace-Konflikte lösen können? Irgendwelche Ideen?
Aktualisieren:
Nur um dies zu verdeutlichen: Antworten, die vorschlagen, wie Namespace-Kollisionen im Voraus vermieden oder ein besserer Namespace erstellt werden können, sind auf jeden Fall willkommen. Ich werde sie jedoch nicht als Antwort akzeptieren, da sie mein Problem nicht lösen. Ich habe zwei Bibliotheken und ihre Klassennamen kollidieren. Ich kann sie nicht ändern; Ich habe keine Quelle von beiden. Die Kollision ist bereits da und Tipps, wie sie im Voraus hätte vermieden werden können, helfen nicht mehr. Ich kann sie an die Entwickler dieser Frameworks weiterleiten und hoffe, dass sie in Zukunft einen besseren Namespace wählen, aber im Moment suche ich nach einer Lösung, um mit den Frameworks jetzt in einer einzigen Anwendung zu arbeiten. Irgendwelche Lösungen, um dies zu ermöglichen?