objective c - servicio - NSLog el nombre del método con objetivo-C en iPhone
mi iphone cambio de color la pantalla (6)
tl; dr
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
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:
- El preprocesador C proporciona algunas macros .
- Objective-C proporciona expresiones (métodos).
- Pase el argumento implícito para el selector del método actual:
_cmd
- Pase el argumento implícito para el selector del método actual:
Como indicaron otras respuestas, para obtener simplemente el nombre del método actual, llame a:
NSStringFromSelector(_cmd)
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í:
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
Otro ejemplo ... Fragmentos de código que guardo en la Biblioteca de fragmentos de código de Xcode:
NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
... y TRACE en lugar de ERROR ...
NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
... y uno más largo con una descripción codificada que pasa un valor ( [rows count]
) ...
NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"''Table of Contents.txt'' file''s count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );
Macros de preprocesador para registro
Tenga en cuenta el uso de un par de caracteres de subrayado en ambos lados de la macro.
| Macro | Format | Description __func__ %s Current function signature __LINE__ %d Current line number __FILE__ %s Full path to source file __PRETTY_FUNCTION__ %s Like __func__, but includes verbose type information in C++ code.
Expresiones para registrar
| Expression | Format | Description NSStringFromSelector(_cmd) %@ Name of the current selector NSStringFromClass([self class]) %@ Current object''s class name [[NSString %@ Source code file name stringWithUTF8String:__FILE__] lastPathComponent] [NSThread callStackSymbols] %@ NSArray of stack trace
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 he usado un gran framework de registro en Java ( SLF4J + LogBack ) pero no en Cocoa.
Consulte esta pregunta para obtener 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 formas descritas por esta publicación de blog de Codec :
- Usando Objective-C llame a NSStringFromSelector :
NSLog(@"%@", NSStringFromSelector(selector) );
- Usando C directamente:
NSLog(@"%s", selector );
Esta información se extrajo de la página de documento de Apple vinculada a 2013-07-19. Esa página se actualizó por última vez el 2011-10-04.
Actualmente, nos estamos definiendo a nosotros mismos como un mecanismo de registro extendido para imprimir el nombre de clase y el número de línea fuente del registro.
#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], /
__LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
Por ejemplo, cuando llamo NCLog (@ "Hello world"); El resultado será:
<ApplicationDelegate:10>Hello world
Ahora también quiero cerrar la sesión del nombre del método como:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Por lo tanto, esto haría que nuestra depuración sea más fácil cuando podamos saber qué método se llama. Sé que también tenemos el depurador de XCode, pero a veces también quiero depurarme desconectándome.
En Swift 4:
prueba de func () {
print(#function)
}
test () // imprime el valor "test ()"
En realidad es tan simple como:
printf(_cmd);
Por alguna razón iOS permite que _cmd pase como un carácter literal sin siquiera una advertencia de compilación. Quién sabe
Para responder técnicamente a su pregunta, usted quiere:
NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);
O también podrías hacer:
NSLog(@"%s", __PRETTY_FUNCTION__);
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
Swift 3 y superior
print(#function)