субота, 3 березня 2012 р.

Objective-C(middle level)@"#define COOL_NSLOG"

Привіт! Давно від мене нічого не було чути, проте, я трошки став обізнанішим і сьогодні хотів поділитись однією з фіч. Вивід в лог для нормального програміста - це дуже буденна справа, ібо "No money, no honey" не вивів в лог - не знаєш нічого, проте, як вивявляється цей "honey" дуже ресурсомісткий. На думку включення/виключення логу мене наштовхнув випадок, що нещодавно трапився на роботі, коли на одному проекті після виключення логу час виконання знизився на 1-2 порядки. До того ж, частіше за все стандартним логом є показ того, що в класі А стартував на виконання метод methodB. І ти починаєш лізти в назву класу, "копіпастиш" його назву, потім додаєш назву методу і виходить в тебе щось на кшталкт 
NSLog(@"figure#draw#start");
 а потім в кінці методу, якщо все гуд відповідно
NSLog(@"figure#draw#finish");     
То через десятків два такого мартишковводу поченаєш задумуватися, ну не може ж бути, що немає виходу для такої простої штуки. В нагоді мені стала книжка: 

Beginning iPhone 4 Development Exploring the IOS SDK (існує нове видання Beginning iPhone 5 Development Exploring the IOS SDK )

читаючи дане чудове творіння наткнувся на таку класну річ: 
NSStringFromSelector(_cmd);
(дана штука повертає назву методу, о чудо із чудес, хвала богам надгризяного яблука). Але на цьому ще не все, даби повістю осягнути глубину всіх наших глубин, треба дістати назву класа. Тут ще простіше ніж я міг собі придумати:
[self class];
Тому напівапогейом нашого щастя є такий запис:
NSLog(@"%@ => %@ start", [self class],  NSStringFromSelector(_cmd) );     
та 
NSLog(@"%@ => %@ fiish", [self class],  NSStringFromSelector(_cmd) );
Проте можна сказати ну і що? Глобально нового нічого немає, почекайте, скоро почнеться define magic. Як я вже казав, логи старшно тормозять програми особливо, якщо це телефон + закоментарювать/розкоментарювать явно не надихає. Для себе вихід я знайшов наступним чином:
#define ON_CLASS_LOG

#ifdef ON_CLASS_LOG
#define START_LOG NSLog(@"%@ => %@ start", [self class],  NSStringFromSelector(_cmd) );     
#define END_LOG      NSLog(@"%@ => %@ end", [self class],  NSStringFromSelector(_cmd) );     
#else
#define START_LOG
#define END_LOG
#endif
Наче все, тепер в коді просто використовуємо START_LOG або END_LOG, пушим в Aple Store вимикаємо ON_CLASS_LOG і буде вам щастя та вашому додатку.  

Немає коментарів:

Дописати коментар