¿Hay alguna forma de determinar la línea de código method
desde la que se llamó a un determinado ?
ios
objective-c
debugging
nsthread
ennuikiller
fuente
fuente
Respuestas:
Stack Espero que esto ayude:
fuente
En un código totalmente optimizado, no existe una forma 100% segura de determinar quién llama a un método determinado. El compilador puede emplear una optimización de llamada de cola mientras que el compilador reutiliza efectivamente el marco de pila del llamador para el destinatario.
Para ver un ejemplo de esto, establezca un punto de interrupción en cualquier método dado usando gdb y observe el backtrace. Tenga en cuenta que no ve objc_msgSend () antes de cada llamada a un método. Eso es porque objc_msgSend () hace una llamada final a la implementación de cada método.
Si bien podría compilar su aplicación no optimizada, necesitaría versiones no optimizadas de todas las bibliotecas del sistema para evitar solo este problema.
Y este es solo un problema; en efecto, se está preguntando "¿cómo reinvento CrashTracer o gdb?". Un problema muy duro sobre el que se hacen las carreras. A menos que desee que las "herramientas de depuración" sean su carrera, le recomendaría no seguir este camino.
¿Qué pregunta estás realmente tratando de responder?
fuente
Usando la respuesta proporcionada por intropedro , se me ocurrió esto:
que simplemente me devolverá la clase y función originales:
ps: si se llama a la función mediante performSelector, el resultado será:
fuente
Acabo de escribir un método que hará esto por ti:
fuente
La versión Swift 2.0 de la respuesta de @ Intropedro como referencia;
fuente
Si es por depurar errores, adquiera el hábito de poner un
NSLog(@"%s", __FUNCTION__);
Como la primera línea dentro de cada método en sus clases. Entonces siempre puede saber el orden de las llamadas al método mirando al depurador.
fuente
Puede pasar
self
como uno de los argumentos a la función y luego obtener el nombre de clase del objeto llamador dentro:De esta manera, puede pasarle cualquier objeto que le ayude a determinar dónde podría estar el problema.
fuente
Una versión ligeramente optimizada de la fantástica respuesta de @Roy Kronenfeld:
fuente
@ennuikiller
En la ventana de salida verá algo como lo siguiente.
También puede analizar esta cadena para extraer más datos sobre el marco de la pila.
Se tomó de Identify Calling Method en iOS .
fuente
La versión Swift 4 de @Geoff H responde para copiar y pegar ;]
fuente
La versión Swift 3 de @Geoff H responde como referencia:
fuente