Gibt es eine Möglichkeit, die Codezeile zu bestimmen, aus der eine bestimmte method
aufgerufen wurde?
ios
objective-c
debugging
nsthread
ennuikiller
quelle
quelle
Antworten:
StackIch hoffe, dass dies hilft:
quelle
In vollständig optimiertem Code gibt es keine 100% todsichere Möglichkeit, den Aufrufer für eine bestimmte Methode zu bestimmen. Der Compiler kann eine Tail-Call-Optimierung verwenden, während der Compiler den Stack-Frame des Aufrufers effektiv für den Angerufenen wiederverwendet.
Um ein Beispiel dafür zu sehen, setzen Sie mit gdb einen Haltepunkt für eine bestimmte Methode und sehen Sie sich die Rückverfolgung an. Beachten Sie, dass objc_msgSend () nicht vor jedem Methodenaufruf angezeigt wird. Dies liegt daran, dass objc_msgSend () einen Tail-Aufruf für die Implementierung jeder Methode ausführt.
Während Sie Ihre Anwendung nicht optimiert kompilieren könnten, würden Sie nicht optimierte Versionen aller Systembibliotheken benötigen, um nur dieses eine Problem zu vermeiden.
Und das ist nur ein Problem; Tatsächlich fragen Sie: "Wie erfinde ich CrashTracer oder gdb neu?". Ein sehr schwieriges Problem, auf dem Karrieren gemacht werden. Wenn Sie nicht möchten, dass "Debugging-Tools" Ihre Karriere sind, würde ich empfehlen, diesen Weg nicht einzuschlagen.
Welche Frage versuchst du wirklich zu beantworten?
quelle
Mit der Antwort von intropedro kam ich auf Folgendes :
das wird mir einfach zurückgeben Ursprüngliche Klasse und Funktion:
ps - Wenn die Funktion mit performSelector aufgerufen wird, lautet das Ergebnis:
quelle
Ich habe gerade eine Methode geschrieben, die dies für Sie erledigt:
quelle
Die Swift 2.0-Version von @ Intropedros Antwort als Referenz;
quelle
Wenn es um das Debbuging geht, gewöhnen Sie sich an, ein
NSLog(@"%s", __FUNCTION__);
Als erste Zeile in jeder Methode in Ihren Klassen. Dann können Sie die Reihenfolge der Methodenaufrufe immer anhand des Debuggers erkennen.
quelle
Sie können
self
als eines der Argumente an die Funktion übergeben und dann den Klassennamen des Aufruferobjekts darin abrufen:Auf diese Weise können Sie jedes Objekt übergeben, mit dessen Hilfe Sie feststellen können, wo das Problem liegen könnte.
quelle
Eine leicht optimierte Version von @Roy Kronenfelds fantastischer Antwort:
quelle
@ennuikiller
Im Ausgabefenster sehen Sie ungefähr Folgendes.
Sie können diese Zeichenfolge auch analysieren, um weitere Daten zum Stapelrahmen zu extrahieren.
Es wurde aus der Anrufmethode identifizieren in iOS übernommen .
quelle
Die Swift 4-Version von @Geoff H antwortet zum Kopieren und Einfügen ;]
quelle
Die Swift 3-Version von @Geoff H als Referenz:
quelle