Ich finde, dass der schnellste (aber etwas schmutzige) Weg, dies zu tun, darin besteht, objc_msgSend direkt aufzurufen. Es ist jedoch gefährlich, es direkt aufzurufen, da Sie die Dokumentation lesen und sicherstellen müssen, dass Sie die richtige Variante für den Typ des Rückgabewerts verwenden, und weil objc_msgSend aus Gründen des Compiler-Komforts als vararg definiert ist, aber tatsächlich als schneller Montagekleber implementiert ist . Hier ist ein Code zum Aufrufen einer Delegate-Methode - [delegate integerDidChange:], die ein einzelnes Integer-Argument akzeptiert.
#import <objc/message.h>
SEL theSelector = @selector(integerDidChange:);
if ([self.delegate respondsToSelector:theSelector])
{
typedef void (*IntegerDidChangeFuncPtrType)(id, SEL, NSInteger);
IntegerDidChangeFuncPtrType MyFunction = (IntegerDidChangeFuncPtrType)objc_msgSend;
MyFunction(self.delegate, theSelector, theIntegerThatChanged);
}
Dadurch wird zuerst der Selektor gespeichert, da wir mehrmals darauf verweisen werden und es einfach wäre, einen Tippfehler zu erstellen. Anschließend wird überprüft, ob der Delegat tatsächlich auf den Selektor reagiert. Dies kann ein optionales Protokoll sein. Anschließend wird ein Funktionszeigertyp erstellt, der die tatsächliche Signatur des Selektors angibt. Beachten Sie, dass alle Objective-C-Nachrichten zwei versteckte erste Argumente haben, nämlich das zu sendende Objekt und die gesendete Auswahl. Dann erstellen wir einen Funktionszeiger des entsprechenden Typs und setzen ihn so, dass er auf die zugrunde liegende Funktion objc_msgSend zeigt. Beachten Sie, dass Sie eine andere Variante von objc_msgSend verwenden müssen, wenn der Rückgabewert ein float oder eine Struktur ist. Senden Sie die Nachricht abschließend mit derselben Maschine, die Objective-C unter den Arbeitsblättern verwendet.