Frage

Ich verstehe, dass wir assoziative Referenzen verwenden können, um ivar-ähnliches Verhalten in Kategorien hervorzurufen.Aber was ist der konkrete Grund dafür, dass keine neuen Ivars in Kategorien deklariert werden können?

Liegt es daran, dass wir in den privaten Bereich der Klasse eindringen würden?Oder gibt es einen anderen Grund?Wenn ja, würde ich mich über ein Beispiel freuen, das die Möglichkeit zeigt, Ivars in Kategorien zu deklarieren, die alles kaputt machen, was sie kaputt machen.

War es hilfreich?

Lösung

Stellen Sie sich die Ivars von Objective-C wie eine einfache alte C-Struktur vor.Wenn Sie eine Instanz einer Klasse instanziieren, wird ein Speicherblock erstellt, der groß genug ist, um diese Struktur aufzunehmen.

Nehmen wir an, Sie haben eine NSString.Viele, viele vorhandene Codes werden zur Verwendung kompiliert NSString.Ein Großteil dieses Codes ist in Bibliotheken und Frameworks integriert.Dieser kompilierte Code wurde in dem Wissen erstellt, dass die Ivars von NSString Nehmen Sie X Bytes an und befinden Sie sich an bestimmten Offsets in diesem Speicher.

Nehmen wir an, Sie erstellen nun in Ihrem eigenen kleinen Projekt eine Kategorie NSString und möchte einen Ivar hinzufügen.Theoretisch würde jeder Code in Ihrem Projekt, der die Header-Datei für die Kategorie enthält, wissen, dass die Größe dieser „neuen“ NSString (plus Kategorie) benötigt X + Y Bytes.Dies ist einer Unterklasse sehr ähnlich.Dieser neu kompilierte Code könnte die zusätzlichen Ivar(s) ordnungsgemäß verarbeiten.

Aber der gesamte vorkompilierte Code, die Bibliotheken und Frameworks hätten keine Kenntnis von den zusätzlichen Ivars.Wann NSString Wenn dort Instanzen erstellt werden, beträgt der Speicher nur X Bytes, nicht X + Y Bytes.Chaos entsteht, wenn Ihr App-Code einen Verweis auf diesen kleineren Speicherblock erhält und versucht, auf die Bytes für die Kategorie ivar zuzugreifen.Es würde boomen.

Mit einer einfachen alten Unterklasse funktionieren die Dinge, weil jeder Code, der die Ivars der Unterklasse verwenden kann, über die Ivars der Unterklasse Bescheid weiß.Aber bei einer Kategorie kennt der bereits vorhandene Code die Ergänzungen nicht und schafft nicht ausreichend Platz dafür.

Ich denke, ich sollte klarstellen, dass es sich bei all dem oben Genannten größtenteils um eine fundierte Vermutung handelt.Ich könnte völlig falsch liegen.Es erscheint zumindest vernünftig.:) :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top