Hier ist die tatsächliche Implementierung von retain
von später in der Datei:
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.
Tags und Links objective-c assembly inline-assembly libobjc