2009-05-18 4 views
7

Obj-C 2.0 lässt mich Eigenschaften in einer Kategorie deklarieren, aber der Compiler weigert sich, Accessoren innerhalb der Kategorie zu synthetisieren. Warum?Warum kann ich Accessoren in einer Kategorie nicht synthetisieren?

(Manchmal macht es Organisation Sinn, eine Menge verwandter Sachen in eine Kategorie zu legen - auch wenn die Unterstützung iVars in die Klassendeklaration geht. Ich weiß über Klassenerweiterungen und wie man private Eigenschaften tut, aber das ist nicht meine Anwendungsfall.)

Antwort

0

Die dort gestellte Frage behandelt das private Accessor-Problem. Dies nähert sich von einem nicht privaten Accessor POV.

9

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

Aufgrund dieser Implementierung haben die Kategorien selbst keinen Zugriff auf den Speicher für eine Klasse und können daher nicht geändert werden (es ergibt sich auch die Frage, was zu tun ist, wenn die Kategorie nicht geladen wird).

Schließlich, von einer eher logischen als technischen Perspektive, ist die Idee, dass eine Kategorie keine "Eigentümerschaft" der In-Memory-Struktur einer Klasse hat, es verbindet einfach einige neue Methoden. Um die Eigenschaftensynthese vollständig zu unterstützen, müsste der Klassenspeicher in irgendeiner Weise geändert werden.

Die Lösung? Entweder setzen Sie die @ synthesize-Anweisungen in Ihren main @implementation-Block oder Sie implementieren einfach Ihre eigenen Zugriffsmethoden direkt in der Kategorie @implementation.

+0

Lassen Sie mich genauer sein. Ich habe einige Methoden aus organisatorischen Gründen in eine Kategorie aufgeteilt, und da ich die Klasse besitze, habe ich der Klassenschnittstelle entsprechende iVars hinzugefügt. Aber ich kann immer noch nicht die Methoden in der Kategorie synthetisieren. Gibt es einen technischen Grund, warum nicht? Ich sehe immer noch keinen. –

+0

Das macht keinen großen Unterschied. Die Tatsache, dass Sie der Autor der Klasse und der Kategorie sind, wird von der Laufzeitumgebung in keiner Weise codiert. Daher ist die Kategorie immer noch eine separate Entität ohne Verbindung zu den Speicherbezeichnern der Klasse, auf die sie verweist. Wie ich schon sagte, es ist eine Art "Schutz" -Mechanismus - Sie müssen nur die Variablen innerhalb des @implementation-Hauptblocks für die Klasse synthetisieren (das funktioniert gut für mich). –

Verwandte Themen