7 Stimmen

Warum kann ich keine @synthesize-Accessoren in einer Kategorie verwenden?

In Obj-C 2.0 kann ich Eigenschaften in einer Kategorie deklarieren, aber der Compiler weigert sich, Accessors innerhalb der Kategorie zu synthetisieren. Warum?

(Manchmal ist es organisatorisch sinnvoll, einen Haufen verwandter Dinge in eine Kategorie zu packen - auch wenn die unterstützenden iVars in die Klassendeklaration gehören. Ich kenne mich mit Klassenerweiterungen aus und weiß, wie man private Eigenschaften verwendet, aber das ist nicht mein Anwendungsfall).

9voto

Jim Dovey Punkte 11106

Das Problem besteht darin, dass Kategorien logisch von ihren Klassen getrennt sind und sogar separat in der Binärdatei gespeichert werden. Die interne Implementierung besteht darin, dass eine Klassenbeschreibungsstruktur ein Array von Methodenlisten enthält, das anfangs nur die Liste der Methoden enthält, die in der Haupt @implementation blockieren. Wenn die ObjC-Linkermodule neue Kategorien laden, werden ihre Methodenlisten zu diesem Array hinzugefügt.

Aufgrund dieser Implementierung haben die Kategorien selbst keine Möglichkeit, auf den Speicher einer Klasse zuzugreifen, und können ihn daher nicht ändern (es stellt sich auch die Frage, was zu tun ist, wenn die Kategorie entladen wird).

Aus einer eher logischen als technischen Perspektive schließlich ist die Idee, dass eine Kategorie keinen "Besitz" an der speicherinternen Struktur einer Klasse hat, sondern lediglich einige neue Methoden zuordnet. Um die Eigenschaftssynthese vollständig zu unterstützen, müsste sie den Speicher der Klasse in irgendeiner Weise verändern

Die Lösung? Entweder Sie fügen die @synthesize-Anweisungen in Ihren @implementation-Hauptblock ein, oder Sie implementieren Ihre eigenen Accessors direkt innerhalb der Kategorie @implementation.

0voto

Die dort gestellte Frage betrifft das Problem des privaten Zugangs. Dieser Ansatz geht von einem nicht-privaten Accessor-POV aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X