Método NSLog personalizado (Variadic)

Estoy intentando crear un método DNSLog() , DNSLog() , que ejecuta el NSLog solo si la variable de debugging es verdadera.

 -(void)DNSLog:(NSString *)formatString, ... { if(debug){ va_list args; va_start(args, formatString); NSLog([[NSString alloc] initWithFormat:formatString arguments:args]); va_end(args); } } 

Pero cuando trato de llamarlo usando

 DNSLog(@"Hello %d",x); 

Recibo un error de compilation:

 Undefined symbols for architecture i386: "_DZNSLog", referenced from: -[RestaurantInfoViewController viewDidLoad] in RestaurantInfoViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

He usado esto como reference: http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html

Donde estoy yendo mal

Has confundido methods y funciones : Objective-C tiene ambos. NSLog es una function estándar por lo que lo llamas NSLog(...) . Has definido un método:

 -(void)DNSLog:(NSString *)formatString, ... 

pero trató de llamarlo como una function. Para llamar a su método, debe hacer lo siguiente:

 [self DNSLog:@"Hello %d", x]; 

A medida que comstack su código, debe tener una variable de debug global o de instancia. Si es global, entonces podría definir DNSLog como una function (esto no funcionará si debug es una variable de instancia ya que solo los methods pueden acceder directamente a ellos). La function comenzaría:

  void DNSLog(NSString *formatString, ...) 

El cuerpo de la function será el mismo que para el método.

NSLog también tiene un atributo, NS_FORMAT_FUNCTION , para decirle al comstackdor que toma una cadena de formatting como argumento, ya que el comstackdor comprobará la cadena de formatting y los arguments para ver si coinciden. Para hacer esto para su método o function escriba:

 -(void)DNSLog:(NSString *)formatString, ... NS_FORMAT_FUNCTION(1,2); 

o:

 void DNSLog(NSString *formatString, ...) NS_FORMAT_FUNCTION(1,2); 

en la interfaz o file de encabezado.

HTH

En lugar de utilizar un método personalizado, intente agregar esta macro a su aplicación, quizás en su file .pch.

 #ifdef DEBUG #define MyLog(x, ...) NSLog(@"%s %d: " x, __FUNCTION__, __LINE__, ##__VA_ARGS__) #else #define MyLog(x, ...) #endif 

Esto ejecutará un logging personalizado que llamo MyLog cuando está en modo de debugging, y cuando está en versión, no hará nada. También imprime otra información útil como el file y el número de línea del logging.

Gracias a todos por sus respuestas "valiosas", "alentadoras" y "de apoyo" para un principiante.

Encontré mi error y aquí está el código de trabajo corregido:

 void ZNSLog(NSString *format, ...){ if(!ENABLE_DEBUGGING) return; va_list args; va_start(args, format); NSLogv(format, args); va_end(args); } ZNSLog(@"Hello"); 

El método anterior que estaba usando era un método Objective C

 -(void)DNSLog:(NSString *)formatString, ... 

a lo que intentaba llamar utilizando una function C llamada.