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.
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. –
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). –