performSelector vs. direkte Anrufleistung

8

Gibt es einen signifikanten Unterschied in der Leistung, wenn Sie

aufrufen? %Vor%

vs

%Vor%

?

    
romaonthego 28.07.2011, 01:47
quelle

7 Antworten

7

Der erste bewirkt einen zusätzlichen Aufruf von objc_msgSend (), der im zweiten Fall nicht notwendig ist.

Es ist unwahrscheinlich, dass der Leistungsunterschied von äußerster Wichtigkeit ist, es sei denn, Sie rufen die Methode so schnell auf, wie Sie es möglicherweise tun können. Zehntausende Male und machen Sie keine nennenswerte Arbeit in testMethod: .

i.e. Mach dir keine Sorgen, es sei denn, du misst ein tatsächliches Leistungsproblem.

    
bbum 28.07.2011, 03:07
quelle
2

Interessanterweise führt das Ausführen eines Selektors mit einer Verzögerung von 0 dazu, dass diese Methode am Anfang der nächsten Ausführungsschleife der App aufgerufen wird. Sie können dies verwenden, um bestimmte Ereignisse zu verzögern, die häufig auftreten (in Optimierungen der Benutzeroberfläche häufig verwendet werden, wie Bilder, die in einem UIScrollView neu geladen werden)

    
Arie Litovsky 28.07.2011 04:28
quelle
0

Nein, es gibt keinen Leistungseinbruch, den ich kenne, und wenn es einen gibt, ist es nicht signifikant.

    
Oscar Gomez 28.07.2011 01:49
quelle
0

Es gibt einen großen Unterschied in beiden Methoden. Ich habe versucht, eine Animation von zwei Tasten zu erhalten, die von der rechten Seite kommen und in der Mitte bleiben, aber die zweite Taste kam mit 0,3 Sekunden Verzögerung ... Jetzt der Hauptpunkt kommt hierher ... Ich benutzte eine Animationsmethode für beide 2 Tasten. Jetzt wollte ich, dass, wenn ich auf "Fertig" -Button klicke, dann beide Knöpfe nach links gehen und wieder neue Knöpfe kommen ... Das war in Ordnung bis zum Lesen ...

Nun, als ich die Methode für die Schaltfläche "Finish" schrieb, klickte ich ... Ich führte gerade die Animation der Buttons aus und dann kamen die Buttons .... aber wenn ich die Methode "Above second" verwendete, zB [someObject testMethod:anotherObject]; , dann ist das was passiert Ich konnte die Ausgeh-Animation nicht sehen und es wurde direkt die Animation der Schaltflächen angezeigt ...

Hier kommt tatsächlich die Verwendung der ersten Methode, d.h. [someObject performSelector:@selector(testMethod:) withObject:anotherObject withDelay:delay];

Der Grund, warum ich gefunden habe, ist, wenn ich auf den Finish-Button klicke, läuft die Animation in einem anderen Thread und der andere Code läuft in einem anderen Thread, so dass die Out-Aktion in einem anderen Thread ausgeführt wurde Thread wurde nicht angezeigt ..

Nach der ersten Methode mit Verzögerungszeit der gesamten Animation ... habe ich mein Ziel erreicht .. Also beide Methoden haben ihre eigene Bedeutung ... njoy Programmierung ...

    
DShah 28.07.2011 17:26
quelle
0

Ich habe einen wichtigen Unterschied bei der Übergabe von Daten an einen anderen View-Controller in prepareForSegue festgestellt.

mit:

[viewController performSelector: @selector (aMethod :) withObject: anObject];

aMethod heißt AFTER viewDidLoad und viewWillAppear des Ziel-ViewControllers.

mit:

[viewController aMethod: anObject];

aMethode heißt BEFORE viewDidLoad und viewWillAppear des Ziels viewController.

Wenn Sie also Daten senden, die für die Einrichtung des Ziel-ViewControllers wichtig sind, verwenden Sie den zweiten Weg.

    
Ross Knipe 21.07.2016 13:48
quelle
-1

Für meine Erfahrung gibt es zwei Unterschiede:

  1. Der erste kann afterDelay: (CGFloat) Sekunden hinzufügen, und dies ist der einzige Fall, in dem ich den ersten benutze.

    %Vor%
  2. Der zweite muss in someObject.h definiert werden. Andernfalls erhalten Sie eine Kompilierungswarnung.

Cullen SUN 28.07.2011 01:57
quelle
-2

Die Antwort ist, dass sie genau gleich sind .

Es gibt zwei wirklich gute Artikel von Mike Ash, wo er die objc_msgSend() erklärt:

Und ein anderer von Tom Dalling, der erklärt, dass der Selektor performance objc_msgSend() aufruft.

nscoding 22.10.2013 11:06
quelle

Tags und Links