Warum ruft diese Inline-Assembly Release, Retain und Autorelease in libobjc auf?

8

Der folgende Ausschnitt stammt aus dem ObjC-Laufzeitcode (libobjc) von Apple. Ich frage mich, was das genau bedeutet. (Nicht sehr google-fähig, tut mir leid)

%Vor%

Aktualisierung:

Hier ist, was ein Aufruf von bypass_msgSend_release () generiert:

%Vor%     
mojuba 07.05.2014, 19:44
quelle

1 Antwort

4

Hier ist die tatsächliche Implementierung von retain von später in der Datei:

%Vor%

Wenn es sich um einen markierten Zeiger handelt, tun Sie nichts. Fair genug, das heißt, es bezieht sich nicht auf irgendetwas auf dem Haufen und es gibt keine Retain-Zählung.

Sonst hätten sie in den alten Tagen einfach retain an das Objekt gesendet. Jetzt melden sie retain an das Objekt, wenn festgestellt wurde, dass es eine benutzerdefinierte retain enthält (zweifellos nicht etwas, was die alte Laufzeit aufzeichnen würde, daher die Versionsprüfung), ansonsten verwenden sie die Umgehungsmethode.

Der Bypass scheint direkt die bekannte Adresse von [NSObject retain] aufzurufen.

Also meine Vermutung? Es ist eine Geschwindigkeitsoptimierung. Wenn Sie feststellen, dass keine benutzerdefinierte Retain-Funktion vorhanden ist und Sie direkt zu IMP springen, sparen Sie die Kosten für den dynamischen Versand. Da der Compiler jetzt die C-Aufrufe automatisch unter ARC eingibt (insbesondere nicht die Objective-C-Aufrufe), bedeutet das, dass Sie niemals in die teureren Sachen gehen.

    
Tommy 07.05.2014 21:11
quelle