tecnico servicio pantalla oficial hora como color cambio cambiar apple objective-c c iphone debugging

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

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)