Я использую что-то вроде этого:
#ifdef YOUR_DEBUG_ENABLER_SYMBOL_ONLY_SET_IN_DEBUG_BUILDS
#define DEBUG_ONLY(_code_) _code_
#else
#define DEBUG_ONLY(_code_)
#endif
#define DebugLog(_str, ...) DEBUG_ONLY(NSLog(@"%s: " _str, __func__, ## __VA_ARGS__))
Обратите внимание, что перед _str в NSLog нет запятой - это означает, что строка, используемая в вызывающем коде, добавляется (компилятором) в строку "% s:", чтобы стать строкой составного формата для NSLog , Все параметры, которые вы хотите распечатать, могут быть включены в передаваемую в формате строку. % S применяется к _ _ func _ _, а ваш _str применяется к остальным переданным переменным:
float f;
int i;
NSString* s;
// Initialise f, i, and s to something
...
// Log the values only when in debug mode, with function name auto-prepended
DebugLog(@"float is: %f - int is: %d - string is: %@", f, i, s);
Это имеет то преимущество, что вы можете записывать любой текст и переменные, какие захотите, условно при отладке и с именем функции, автоматически добавленным к выводу.