Sie sollten es als externe Strings wie in Ihrem Beispiel implementieren:
extern NSString * const MyPluginErrorDomain;
oder externe Funktionen bereitstellen, die statische Speicherdaten zurückgeben. Zum Beispiel:
/* h */
extern NSString * MyPluginErrorDomain();
/* m */
NSString * MyPluginErrorDomain() {
static NSString * const s = @"MyPluginErrorDomain";
return s;
}
Der Grund dafür ist, dass Strings und Schlüssel werden häufig verwendet und verglichen mit Zeigerwert oder Hash-Wert, anstatt echtem String-Vergleich (isEqualToString :).
auf Implementierungsebene gibt es einen großen Unterschied zwischen:
In Code, das heißt, dass, wenn die in mehreren Binärdateien definiert verglichen Strings werden:
Say ‚MyPluginErrorDomain‘ und ‚Schlüssel‘ identisch haben String-Werte, sind aber in verschiedenen Binaries definiert (dh im Plugin-Host, im Plug-in).
/////// Pointer comparison (NSString)
BOOL a = [MyPluginErrorDomain isEqualToString:key];
BOOL b = MyPluginErrorDomain == key;
// c may be false because a may be true, in that they represent the same character sequence, but do not point to the same object
BOOL c = a == b;
/////// Hash use (NSString)
// This is true
BOOL d = [MyPluginErrorDomain hash] == [key hash];
// This is indicative if true
BOOL e = [MyPluginErrorDomain hash] == [someOtherStringKey hash];
// because
BOOL f = [MyPluginErrorDomain isEqualToString:someOtherStringKey];
// g may be false (though the hash code is 'generally' correct)
BOOL g = e == f;
Daher müssen in vielen Fällen die Schlüssel zur Verfügung gestellt werden. Es mag wie ein trivialer Punkt erscheinen, aber es ist schwierig, einige der mit dem Unterschied verbundenen Probleme zu diagnostizieren.
Hash-Codes und Zeigervergleiche werden überall in Foundation und anderen Objc-Technologien in den Interna von Dictionary-Speicher, Schlüsselwertcodierung verwendet ... Wenn Ihr Wörterbuch direkt nach xml geht, ist das eine Sache, aber die Laufzeit ist eine andere und In den Details zur Implementierung und zur Laufzeit gibt es einige Einschränkungen.
entfernen C, C++ Tags - das ist objektive C Frage – zaharpopov
Für das C++ bemerkt, siehe auch meinen Kommentar zu Neil Butterworth's interessante Antwort. Ich frage mich immer noch, ob es auch keine C-Lösung gibt, ich kann nicht die erste Person in der Geschichte von C sein, die das erreichen wollte. –
Da dies C-Konstanten sind, musste dieses C nicht entfernt werden – iCaramba