Kann mir Foundation mitteilen, ob eine Objective-C-Methode eine spezielle Strukturrückgabe erfordert?

9

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: Ссылка

    
Erik Doernenburg 09.08.2013, 09:33
quelle

3 Antworten

0

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.

    
JTAS 01.12.2013, 23:03
quelle
0

NSMethodSignature hat eine -methodReturnType , die Sie überprüfen können, um festzustellen, ob der Rückgabetyp struct ist. Ist das, was du versuchst zu tun?

    
Vik 09.08.2013 10:47
quelle
0

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.

    
Ewan Mellor 31.05.2015 03:51
quelle