Können die neuen Clang Objective-C-Literale an benutzerdefinierte Klassen umgeleitet werden?

Obwohl die Überlastung von@ Ich liebe die Hinzufügung der neuen Objective-C-Literale in Clang 3.1. Leider sind die neuen Literale für mich von begrenztem Nutzen. Mit Ausnahme von Fällen, in denen Code mit AppKit zusammenarbeiten muss, habe ich die Verwendung von Foundation-Klassen hauptsächlich zugunsten meines eigenen benutzerdefinierten Frameworks eingestellt (aus einer Reihe von Gründen; die meisten davon bestehen darin, dass ich die verwendeten Speicherzuweisungsmuster direkt steuern muss nach Objekten).

Ich könnte immer einen Runtime-Trick verwenden, um das neu erstellte Objekt als meine benutzerdefinierte Klasse auszugeben (und das habe ich bereits mit String-Objekt-Literalen zu tun, da nur die Nicht-Apple-GCC-Runtime das unterstützt-fconstantstring=class flag), aber dies ist bestenfalls ein Hack und wirft alle Vorteile aus, die ich durch das Ersetzen der entsprechenden Foundation-Klasse gewonnen habe.

Im Gegensatz zu String-Objektliteralen sind die neuen Literale, die Clang implementiert, keine konstanten Klassen (bei denen das Speicherlayout fest codiert ist). Stattdessen werden die entsprechenden Nachrichten an die jeweiligen Klassen gesendet, um zur Laufzeit ein neues Objekt zu erstellen und zu initialisieren. Der Effekt ist nicht anders, als wenn Sie das Objekt selbst erstellt hätten. Theoretisch bedeutet dies, dass die verwendeten Klassen und die von den neuen Literalen aufgerufenen Methoden nicht fest codiert sind. In der Praxis gibt es keine Möglichkeit, sie so zu ändern, dass sie auf meine eigenen benutzerdefinierten Klassen und Methoden verweisen (ich würde sogar gerne auf eine benutzerdefinierte Klasse verweisen; das Verweisen einer Dummy-Methode auf eine tatsächliche Methode zur Laufzeit ist nicht schwierig ).

Als ich dies zum ersten Mal untersuchte, hoffte ich wirklich, eine Reihe von Flags zu finden, die verwendet werden könnten, um das zu tun, wonach ich frage, aber da ich keine gefunden habe, hoffe ich, dass jemand eine Lösung hat.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage