Как NSLog вызывать функцию - PullRequest
       4

Как NSLog вызывать функцию

4 голосов
/ 14 сентября 2011

Не функция, вызывающая NSLog или Dlog, а функция, которая вызывает эту функцию.

Я создал класс

+(void) computeTime:(void (^)())block
{
    NSDate * currentTime = [NSDate date];
    block();
    DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime);
}

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

и сделаем [Tools computeTime: ^ {// operation}];

Однако я хочу знать функцию, которая вызывает этот computeTime.Как мне это сделать?

Ответы [ 2 ]

7 голосов
/ 22 сентября 2013

Другой возможный ответ для того, кто ищет оригинальный вопрос ОП и добавляет к первому предложению Кевина использовать стек вызовов.

Если вы ищете то, что называется функцией (методом), рассмотрите следующее:

 NSArray *callStack = [NSThread callStackSymbols];
 // Top of the stack. Current method
 NSLog(@"Current method: %@", [callStack objectAtIndex:0]);
 // Called by
 NSLog(@"called by: %@", [callStack objectAtIndex:1]);

Возможно, что искомый элемент стека находится дальше в stackArray.

Надеюсь, это поможет быстрее найти ошибку.

7 голосов
/ 14 сентября 2011

Два варианта:

Первый - злоупотребить +[NSThread callStackSymbols], чтобы получить массив всех символов в стеке вызовов и извлечь тот, который вы хотите.Я подозреваю, что это будет относительно медленно.

Второй - использовать макрос.Препроцессор C предоставляет хороший макрос под названием __PRETTY_FUNCTION__, который содержит имя функции, которое все красиво отформатировано, и он хорошо работает и для методов Obj-C.Вместо [Tools computeTime:^{/*operation*/}] вы можете использовать что-то вроде [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:^{/*operation*/}] или обернуть все это в свой собственный макрос, чтобы вы могли сказать TOOLS_COMPUTE_TIME(^{/*operation*/}):

#define TOOLS_COMPUTE_TIME(...) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(__VA_ARGS__)]

Обратите внимание, я использовал varargs- стиль макроса, потому что препроцессор C не очень хорошо понимает синтаксис obj-c, поэтому любые запятые внутри вашего блока будут интерпретироваться как отдельные аргументы макроса.Если бы я определил его, используя TOOLS_COMPUTE_TIME(op), то компилятор жаловался бы, что макрос принимает только 1 аргумент, но ему было дано многократное значение.Используя varargs, компилятору не важно, сколько аргументов вы ему дадите, и он передаст их все на токен __VA_ARGS__.

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