Aufgrund der Funktionsweise von Objective-C-Objekten wird const
die Durchsetzung aufgegeben und es wird eine Notation für den Programmierer. Betrachten Sie dieses Programm:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Das wird hier eigentlich nicht kompiliert (ich verwende Clang): Der Compiler kann den Versuch erkennen, den primitiven C-Typ zu ändern, und gibt einen Fehler aus. Aber jetzt vergleiche es mit diesem Programm:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
Obwohl der Funktion ein konstanter Zeiger auf ein konstantes Objekt übergeben wird, ist es dennoch möglich, das Objekt zu mutieren.
Bei der objektorientierten Programmierung besteht die beste Möglichkeit, die Konstanz eines Objekts durchzusetzen, darin, das Objekt unveränderlich zu machen - dh keine Methoden bereitzustellen, die seinen Zustand ändern können. Stellen Sie sich vor, die obige Funktion hätte NSString
stattdessen ein Argument angenommen NSMutableString
und @"Hello"
statt einer veränderlichen Kopie das Literal übergeben . Vernünftigerweise besteht jetzt keine Chance mehr, das übergebene Objekt zu mutieren [*]. Objective-C hat jedoch keine Möglichkeit, dies zu erzwingen, im Gegensatz zu const
oder final
Objektreferenzen in anderen OO-Sprachen.
Zum Vergleich const
funktioniert das in C ++ ganz anders. Wenn ich einen const
Verweis auf ein C ++ - Objekt erhalte , darf ich nur const
Member-Funktionen für dieses Objekt aufrufen . Diese Funktionen erhalten die const
-ness des Objekts, indem sie entweder keine Änderungen vornehmen oder nur Elementvariablen ändern, die mutable
vom Klassendesigner explizit markiert wurden. Stellen Sie sich vor, ich hätte einen Typ MutableString
in C ++, der dem NSMutableString
in Objective-C entspricht. Das Äquivalent meines obigen Beispiels würde ungefähr so aussehen:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Dies wird definitiv nicht kompiliert: Die Funktion ist appendString()
nicht nur keine const
Operation, sondern entfernt das const
Qualifikationsmerkmal aus der Typreferenz, für die a erforderlich ist const_cast
.
[*] Ich gehe davon aus, dass es eine verdrehte Vorgehensweise gibt, aber jetzt befinden wir uns im Bereich eines Programmierers, der versucht, einen anderen zu sabotieren, indem er "clevere" Dinge tut.
const
Dekoration immer noch als sinnvoll, sodass Sie Verfälschungen wie Aliase oder Casts erhalten, um Warnungen zu unterdrücken. Aufgrund dieser Verfälschungen ändert sich jedoch nichts am Verhalten des Programms.const
dass es in Ziel C immer noch nützlich sein könnte, festzustellen, dass der Zeiger auf ein Objekt niemals einem anderen Objekt zugeordnet ist . Das heißt,NSString * const x
Sie wissen, dass diesx
immer die gleiche Zeichenfolge und keine andere Zeichenfolge sein wird.Was Ziel C betrifft, programmiere ich nicht, kann die Frage also nicht beantworten. Die Frage, die ich jedoch beantworten kann, lautet: "Sollten die Leute
const
beim Programmieren in Objective C viel verwenden?" - Das ist ein definitives "Ja".Konstanz ist im Wesentlichen eine Software-Sicherheitsfunktion, die verwendet wird, um Programme zuverlässiger und wartbarer zu machen. Viele Programmierer wachsen auf, ohne den Wert von
const
s wirklich zu schätzen , bis eines Tages etwas Schlimmes passiert und sie einen "Ah ha" -Moment haben - "Oh, das ist, wofürconst
verwendet wird". Es ist durchaus möglich, ein Programm ohne Konstanten zu schreiben, es ist praktisch unmöglich, ein solches Programm zuverlässig zu machen.Viele Codebeispiele sind eigentlich keine Programme, sondern nur Ausschnitte, die eine bestimmte Funktion aufweisen sollen. Sie werden nicht verwendet,
const
da dies von dem Punkt ablenkt, den die Probe zu machen versucht. Die andere Art von Code, die Sie sehen, ist Code, der von unerfahrenen Programmierern geschrieben wurde, die ihre Arbeit anhand der Beispiele, aus denen sie gelernt haben, oder derjenigen, die sich mit Konstanten auskennen und zu faul sind, um sie zu verwenden.quelle
Ich habe sehr lange nicht mehr mit Objective-C gearbeitet.
Ich frage mich jedoch, warum kein Körper diesen Aspekt erwähnt.
Objective-c hat bereits etwas anderes mit Konstante zu tun. Wandlungsfähigkeit
Beispielsweise zeigt Nstring * auf eine konstante Zeichenfolge. Wenn Sie eine Zeichenfolge möchten, die Sie ändern können, verwenden Sie NMutableString oder ähnliches. Dieser NMutableString stellt zusätzliche Methoden bereit, mit denen Benutzer die Zeichenfolge ändern können.
Was ist nun, wenn der Zeiger selbst eine Konstante sein soll? Ich muss mir darüber keine Gedanken machen, wenn ich ein sehr großes Projekt programmiere.
Deshalb denke ich.
quelle