Проблема в том, что препроцессор C не разбирается в синтаксисе obj-c. Вы можете обойти это, сказав, что ваш макрос принимает varargs
#define TOOLS_COMPUTE_TIME(...) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(__VA_ARGS__)]
Таким образом, между паренами будет что-нибудь и передано. Это не удастся, только если у вас несбалансированная конечная скобка, которая в любом случае должна завершиться неудачей, но вы, вероятно, получите любопытную ошибку компилятора таким образом.
Что касается строковой ошибки, PRETTY_FUNCTION - это строка C (например, char*
), а не строка NSString. Либо переписайте вашу функцию +[Tools computeTimeWithName:block:]
, чтобы она взяла char*
в качестве первого аргумента, либо вместо нее введите [NSString stringWithUTF8String:__PRETTY_FUNCTION__]
(первый проще, просто измените токен формата для вашего журнала на %s
вместо %@
).
В качестве примечания, NSDate не идеален для вычисления времени выполнения, поскольку он основан на тактовом времени, которое подвержено смещению (преднамеренному или иному) и которое может измениться на вас. Вместо этого вы должны исходить из абсолютного времени маха . К счастью для вас, в CoreAnimation есть удобная функция CACurrentMediaTime
, которая возвращает абсолютное время маха, выраженное в виде CFTimeInterval
(например, в секундах). Вместо этого вы можете использовать это для определения надежного времени выполнения блока.