Какие уникальные применения NSLog вы использовали? - PullRequest
0 голосов
/ 23 мая 2009

Есть ли у вас какие-либо уникальные или специальные применения NSLog, которые вы используете для отладки?

Ответы [ 5 ]

11 голосов
/ 23 мая 2009

Мне нравится использовать этот формат для отладки.

NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

Конечно, вы захотите обернуть это в свой собственный метод или функцию для простоты использования. Я использую препроцессор, а также включаю его только для собственного использования и специальных сборок, которые отправляю бета-тестерам. Кстати, это скопировано из моего ответа на этот вопрос.

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

Это заставляет DebugLog действовать так же, как NSLog, но отображает имя файла и номер строки, где он был вызван:

2009-05-23 17:23:40.920 myproject[92523:10b] <AppCon.m:(8)> My debug message...
4 голосов
/ 23 мая 2009

Я использую некоторые макросы с NSLog для быстрой отладки содержимого структур NSPoint, NSSize и NSRect какао:

#define LogPoint(POINT) CMLog(@"%s: (%0.0f, %0.0f)",\
                              #POINT, POINT.x, POINT.y)

#define LogSize(SIZE) CMLog(@"%s: %0.0f x %0.0f",\
                            #SIZE, SIZE.width, SIZE.height)

#define LogRect(RECT) CMLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",\
                            #RECT, RECT.origin.x, RECT.origin.y,\
                            RECT.size.width, RECT.size.height)

Они могут использоваться следующим образом:

LogPoint(somePoint);
LogSize(someSize);
LogRect(someRect);

И они производят следующий вывод:

somePoint: (100, 200)
someSize: 12 x 440
someRect: (120, 240) 326 x 74
3 голосов
/ 23 мая 2009
NSLog(@"%s", __func__);

печатает текущую подпись метода или имя функции.

2 голосов
/ 23 мая 2009

Вот тот, который позволяет сделать отступы для некоторых частей ваших журналов отладки, чтобы сделать вещи более читабельными:

// MyDebugStuff.h:
void MyLog_Indent();
void MyLog_Outdent();
void MyLog(NSString * format, ...);

// MyDebugStuff.m:
int logIndentLevel = 0;

void MyLog_Indent()  { logIndentLevel++; }
void MyLog_Outdent() { if (logIndentLevel > 0) { logIndentLevel--; } }

void MyLog(NSString * format, ...)
{
    va_list args;
    va_start(args, format);

    NSString * indentString = [[NSString stringWithString:@""]
                     stringByPaddingToLength:(2*LogIndentLevel)
                                  withString:@" "
                             startingAtIndex:0];

    NSLogv([NSString stringWithFormat:@"%@%@", indentString, format], args);

    va_end(args);
}

Это можно использовать так:

MyLog(@"Hello, world");
MyLog_Indent();
MyLog(@"Step 1");
MyLog(@"Step 2");
MyLog_Indent();
MyLog(@"Step 2a");
MyLog(@"Step 2b");
MyLog_Outdent();
MyLog(@"Step 3");
MyLog_Outdent();
MyLog(@"Goodbye, cruel world!");

И будет производить:

Hello, world
  Step 1
  Step 2
    Step 2a
    Step 2b
  Step 3
Goodbye, cruel world!
2 голосов
/ 23 мая 2009

Это не функция NSLog, однако она очень удобна для использования с NSLog: вы можете использовать% @ placeholder для объектов, и их описания будут отображаться:

NSLog (@"The object is %@", someKindOfObjectWhichYouWantToDisplay);

Таким образом, вы можете быстро увидеть, например, какой объект вы получили. Это работает путем отправки «описания» селектора объекта, который, конечно, может быть реализован в ваших собственных объектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...