Есть ли плата за широкое использование NSLog?

Как новый программист, я открыл для себя волшебство NSlog и использую его во всем своем коде. Это было чрезвычайно полезно (вместе с NSZombieEnabled) при отладке.

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

Так стоит ли оставить все NSLogs внутри? Он использует больше памяти на устройстве? Или компилятор просто игнорирует их, как комментарии, когда я компилирую для устройства?

РЕДАКТИРОВАТЬ:

Вот что я реализовал по предложению rano.

В моем App_Prefix.pch файле я добавил:

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead     DLog(@"%@", aStringVariable);
#ifdef DEBUG
#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

Затем в моем Project Info инспекторе для конфигурации Debug под заголовком GCC 4.2 - Preprocessing, я добавил значение DEBUG в верхнюю запись под названием Preprocessor Macros.

Работает как шарм - DLog выводит, когда я создаю Debug версию, а ALog всегда выводит.


person Steve    schedule 08.11.2010    source источник


Ответы (3)


NSLog, безусловно, более дорогой, чем простой printf, но он немного более интегрирован в структуру Objective-C и Какао.

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

Таким образом, вы также можете заставить компилятор игнорировать его, когда он больше не нужен (например, когда вы выпускаете свой фрагмент кода). В общем, вы могли #ifdef вызывать функцию журнала при вычислении интенсивных циклов / последовательностей кода.

person rano    schedule 08.11.2010
comment
Я просто хотел опубликовать ту же ссылку. Особенно стоит взглянуть на комментарий 15 Билла Холлингса - person Matthias Bauch; 09.11.2010
comment
@fluchtpunkt да, этот хедр полезен. Несмотря на то, что я предпочитаю более короткое имя для моей функции ведения журнала, что-то вроде DNSLog, и таким образом я могу легко преобразовать предыдущие. - person rano; 09.11.2010

NSLog не реализован как макрос, поэтому определенно придется платить. Определить его количественно и решить, насколько он важен, труднее. Единственный надежный способ сделать это - измерить собственное приложение.

person Steven Fisher    schedule 08.11.2010

Ответы выше устарели. Вам следует просто использовать CocoaLumberjack, который значительно превосходит NSLog и предоставляет гораздо больше функциональных возможностей, чем приведенные выше ответы.

person dbainbridge    schedule 02.01.2013