Ist es möglich, ein Verfahren als Argument in Objective-C zu übergeben?
-
21-08-2019 - |
Frage
ich eine Methode, die innerhalb von einem einzigen Methodenaufruf variiert, und ich mag die Methode / Unterschrift des Verfahrens zu übergeben, die sie durch als Argument ändert ... ist das möglich in Objective C oder ist das zu viel zu hoffen?
Lösung
NSInvocation ist eine Klasse für die Verpackung eines Methodenaufrufes in einem Objekt auf. Sie können einen Selektor (Methodensignatur) gesetzt, setzen Argumente Index. Anschließend können Sie das Ziel gesetzt, und rufen Sie rufen den Anruf auszulösen, oder das Ziel nicht gesetzt verlassen und invokeWithTarget benutzen. In einer Schleife von einer Art dies auf viele Objekte zu nennen
Ich denke, es ist ein wenig wie das funktioniert:
NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];
for (MyClass *myObj in myObjects) {
[inv invokeWithTarget:myObj];
}
Oder wenn Sie nicht wollen Aufruf Objekte in diese Methode übergeben Sie die SEL Typ verwenden können einen Selektor (Methodensignatur) zu übernehmen.
-(void)fooWithMethod:(SEL)selector;
Dann weisen Sie den Wähler auf einen Aufruf Objekt, um es auf Objekte zu nennen.
Andere Tipps
Oder wenn Sie die fooWithMethod:(SEL)selector
Ansatz verwenden, haben [myObject performSelector:selector]
einfach darauf, wenn es keine anderen Argumente hat.
Siehe NSObject für Details .
Wie gesagt, bevor Sie die Auswahl der Methode übergeben können Sie anrufen möchten. Mit einem Wähler gibt es verschiedene Möglichkeiten, um das Verfahren tatsächlich zu nennen:
- mit
NSObject
sperformSelector:
,performSelector:withObject:
undperformSelector:withObject:withObject:
Methoden - mit einem
NSInvocation
Objekt - oder direkt mit
objc_msgSend
oderobjc_msgSend_stret
- mit der
IMP
dieser Methode, die SiemethodForSelector:
mit bekommen
Welche man wirklich hängt von der Situation zu verwenden. Wenn die Leistung nicht kritisch würde ich mit 1 gehen Sie vor, wenn Sie in 0, 1 oder 2 Objekte übergeben müssen. Wenn die performSelector:...
Methoden Ich gehe nicht übereinstimmen würde mit 2 oder 3. Da ein NSInvocation
Objekt eine Menge Standardcode erfordert die Einrichtung I 3 bevorzugen, aber ich denke, das ist eine Frage der persönlichen Wahl, es sei denn, es Performance-Probleme sind.
Wenn die Leistung dieser Methode Anrufe egal I 3 verwenden würde oder 4. 3 soll schneller sein, wenn Sie die IMP
s cachen. Aber je nach Ihrem Code kann dies nicht möglich sein oder nicht wirklich helfen. So, hier müssen Sie den Code Profil und sehen, welche für Sie besser ist.