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?

War es hilfreich?

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:

  1. mit NSObjects performSelector:, performSelector:withObject: und performSelector:withObject:withObject: Methoden
  2. mit einem NSInvocation Objekt
  3. oder direkt mit objc_msgSend oder objc_msgSend_stret
  4. mit der IMP dieser Methode, die Sie methodForSelector: 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 IMPs 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top