Actualmente, nos estamos definiendo un mecanismo de registro extendido para imprimir el nombre de la clase y el número de línea de origen del registro.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Por ejemplo, cuando llamo a NCLog (@ "Hola mundo"); El resultado será:
<ApplicationDelegate:10>Hello world
Ahora también quiero desconectar el nombre del método como:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Por lo tanto, esto facilitaría nuestra depuración cuando podamos saber qué método se llama. Sé que también tenemos el depurador Xcode, pero a veces, también quiero hacer la depuración cerrando sesión.
objective-c
c
iphone
debugging
vodkhang
fuente
fuente
iPhone
proyecto, en realidad lo hice manualmente. Me encantaría ver la respuesta a esto.Respuestas:
Swift 3 y superior
fuente
NSLog(@"%@", NSStringFromSelector(_cmd))
, si vas a usar_cmd
, ya que AFAIK Apple declara_cmd
como tipoSEL
, no una C-string. El hecho de que se implemente como una cadena en C (a partir de las versiones actuales de Mac OS X y iPhone OS) no significa que deba usarlo de esa manera, ya que Apple podría cambiarlo en una actualización del sistema operativo.[self doSomething:arg1 somethingElse:arg2]
se convierten en la llamada de función Cobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. El segundo parámetro deobjc_msgSend()
toma achar*
. Recuerde que debido a que el tiempo de ejecución de Objective-C es dinámico, en realidad está usando una tabla de búsqueda para determinar qué método llamar a qué clase, por lo que un char * es conveniente ya que los métodos se representan como cadenas en la tabla de búsqueda.print("\(#function)")
Para responder técnicamente a su pregunta, desea:
O también podrías hacer:
fuente
__FUNCTION__
y su bastante equivalente también está disponible en funciones C.__FUNCTION__
también incluye el nombre de la clasetl; dr
Detalles
Apple tiene una página de preguntas y respuestas técnicas: QA1669 - ¿Cómo puedo agregar información de contexto, como el método actual o el número de línea, a mis declaraciones de registro?
Para ayudar con el registro:
_cmd
Como indican otras respuestas, para obtener simplemente el nombre del método actual, llame a:
Para obtener el nombre del método actual y el número de línea actual, use estas dos macros
__func__
y__LINE__
como se ve aquí:Otro ejemplo ... Fragmentos de código que guardo en la Biblioteca de fragmentos de código de Xcode:
... y TRACE en lugar de ERROR ...
... y una más larga con una descripción codificada que pasa un valor (
[rows count]
) ...Macros de preprocesador para iniciar sesión
Tenga en cuenta el uso de un par de caracteres de subrayado en ambos lados de la macro.
Expresiones para iniciar sesión
Marcos de registro
Algunos marcos de registro también pueden ayudar a obtener el método actual o el número de línea. No estoy seguro, ya que utilicé un excelente marco de registro en Java ( SLF4J + LogBack ) pero no en Cocoa.
Vea esta pregunta para enlaces a varios marcos de registro de Cocoa.
Nombre del selector
Si tiene una variable Selector (un SEL ), puede imprimir su nombre de método ("mensaje") de cualquiera de las dos maneras que se describen en esta publicación de blog Codec :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Esta información se extrajo de la página del documento de Apple vinculada a partir del 19/07/2013. Esa página se actualizó por última vez el 2011-10-04.
fuente
sel_getName(SEL)
ya que SEL es un tipo opaco y podría no ser siempre unchar *
fuente
En realidad es tan simple como:
Por alguna razón, iOS permite que _cmd se pase como un carácter literal sin siquiera una advertencia de compilación. Quién sabe
fuente
En Swift 4:
prueba de función () {
}
test () // imprime el valor "test ()"
fuente