Hintergrund, wie ich es verstehe: Objective-C-Methodenaufrufe sind im Grunde genommen ein C-Funktionsaufruf mit zwei versteckten Parametern (dem Empfänger und dem Selektor). Die Objective-C-Laufzeitumgebung enthält eine Funktion namens objc_msgSend (), mit der Methoden auf diese Weise aufgerufen werden können. Wenn eine Funktion eine Struktur zurückgibt, kann leider eine spezielle Behandlung erforderlich sein. Es gibt arkane (einige könnten verrückt sagen) Regeln, die bestimmen, ob die Struktur wie andere Werte zurückgegeben wird oder ob sie tatsächlich durch Verweis in einem versteckten ersten Argument zurückgegeben wird. Für Objective-C gibt es eine andere Funktion namens objc_msgSend_stret (), die in diesen Fällen verwendet werden muss.
Die Frage: Kann NSMethodSignature oder etwas anderes mir eine Methode geben, ob ich objc_msgSend () oder objc_msgSend_stret () verwenden soll? Bis jetzt haben wir herausgefunden, dass NSMethodSignature das weiß, es druckt es in seiner Debug-Ausgabe, aber es scheint keine öffentliche API zu geben.
Falls Sie mit "Warum in aller Welt möchten Sie das tun?" antworten möchten, lesen Sie bitte Folgendes, bevor Sie das tun: Ссылка
Objective-C verwendet dieselbe zugrundeliegende ABI für C in einer gegebenen Architektur, weil Methoden nur C-Funktionen mit impliziten self
und _cmd
Argumenten sind.
Mit anderen Worten, wenn Sie eine Methode haben:
%Vor%dann ist das wirklich eine einfache C-Funktion:
%Vor% Ich bin mir ziemlich sicher, dass Sie das schon wissen, aber ich erwähne es nur für andere Leser.
Mit anderen Worten, Sie möchten libffi oder eine ähnliche Bibliothek fragen, wie SomeStructType
für diese Architektur zurückgegeben wird.
Von Ссылка :
Die Regeln, nach denen Strukturtypen in Registern zurückgegeben werden, sind immer geheimnisvoll, manchmal wahnsinnig. ppc32 ist trivial: Strukturen kehren nie zurück Register. i386 ist einfach: Strukturen mit der Größe genau gleich zu 1, 2, 4 oder 8 kehren in Registern zurück. x86_64 ist komplizierter, einschließlich Regeln für die Rückgabe von Fließkomma-Strukturfeldern in FPU Register und ppc64 Regeln und Ausnahmen werden Ihren Kopf drehen. Die blutigen Details sind jedoch im Mac OS X ABI Guide dokumentiert Üblich wenn die Dokumentation und der Compiler nicht übereinstimmen Dokumentation ist falsch.
Wenn Sie objc_msgSend direkt aufrufen und wissen müssen, ob Verwenden Sie objc_msgSend_stret für einen bestimmten Strukturtyp, ich empfehle die empirischer Ansatz: Schreibe eine Codezeile, die deine Methode aufruft, kompilieren Sie es auf jeder Architektur, die Sie interessieren, und schauen Sie sich die Assembler-Code, um zu sehen, welche Dispatch-Funktion der Compiler verwendet.
Tags und Links objective-c objective-c-runtime