Два варианта:
Первый - злоупотребить +[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__
.