Ich habe das Original belassen, damit die Leute den Kontext der Kommentare verstehen können. Ich hoffe, dass dieses Beispiel besser erklärt, worum es mir geht.
Kann ich in Obj-C eine Klasse mit Dateisichtbarkeit erstellen?
Zum Beispiel habe ich eine Methode-sqizzling Kategorie auf NSNotificationCenter geschrieben, die automatisch jeden Beobachter entfernen wird, wenn es deallocs.
Ich verwende eine Hilfsklasse in der Implementierung, und um Namenskollisionen zu vermeiden, habe ich ein Namensschema entwickelt. Die Kategorie ist NSNotificationCenter (WJHAutoRemoval), also heißt die private Hilfsklasse, die in diesem Code verwendet wird,...
WJH_NSNotification_WJHAutoRemoval__Private__BlockObserver
Das ist ein ganz schöner Brocken, und im Moment mache ich nur das hier...
#define BlockObserver WJH_NSNotification_WJHAutoRemoval__Private__BlockObserver
und verwenden Sie einfach BlockObserver im Code.
Diese Lösung gefällt mir jedoch nicht.
Ich möchte dem Compiler mitteilen: "Hey, diese Klasse heißt Bar. Mein Code wird auf sie als Bar zugreifen, aber ich bin wirklich der Einzige, der das wissen muss. Erfinde selbst einen ausgefallenen Namen, oder noch besser, exportiere das Symbol gar nicht erst, denn ich bin der Einzige, den das interessieren sollte."
Für einfaches C würde ich "static" und für C++ "namespace { }" verwenden.
Was ist die bevorzugte/beste/einzige Methode, dies in Obj-C zu tun?
Ursprüngliche Frage
Ich möchte eine Hilfsklasse innerhalb der Implementierung einer anderen Klasse verwenden. Ich möchte jedoch keine externe Verknüpfung. Im Moment bin ich nur machen die Helfer-Klasse Name schmerzlich eindeutig, so dass ich nicht doppelte Linker Symbole erhalten.
Ich kann statische C-Funktionen verwenden, aber ich möchte eine Hilfsklasse schreiben, mit Linker Sichtbarkeit nur innerhalb der Kompilierungseinheit.
Ich möchte zum Beispiel etwas wie das Folgende in mehreren .m-Dateien haben, wobei jeder "Helper" nur in dieser Datei vorkommt und keine andere Kompiliereinheit Zugriff auf den Linker hat. Wenn ich dies in 10 verschiedenen Dateien hätte, würde ich 10 separate Klassen haben.
@interface Helper : NSObject
...
@end
@implementation Helper : NSObject
...
@end
Ich habe nirgendwo auch nur einen Hinweis darauf finden können, und meine schwachen Versuche, der Schnittstelle/Implementierung "static" voranzustellen, waren fehlerhaft.
Danke!