Я хочу сделать что-то вроде этого:
#import <sys/time.h>
typedef long long int64;
int64 int64Micro(void)
{
struct timeval timestruct;
gettimeofday(×truct, NULL);
return ((int64)timestruct.tv_sec)*((int64)1000000)+(int64)timestruct.tv_usec;
}
int64 lasttime = 0;
id objc_msgSend(id self, SEL op, ...)
{
int64 starttime = int64Micro();
va_list argptr;
va_start(argptr, op);
id retVal = 0;//objc_msgSendv(self, op, method_getSizeOfArguments(op), argptr);
va_end(argptr);
int64 cost = int64Micro()-starttime;
if(cost > 1000)
NSLog(@"%@() : %lld µs\n", NSStringFromSelector(op), cost);
return retVal;
}
, чтобы иметь возможность вести журнал для каждого метода в центральном месте кода, когда он становится очень дорогим (1.000 мкс или 1 мс простозначение-пример, конечно, может быть скорректировано, но не должно быть небольшим, так как в противном случае ведение журнала будет стоить больше времени, поскольку выполнение метода, регистрируемого, для большинства методов).
Как на iPhoneдинамические библиотеки не возможны, нет способа заменить objc_msgSend-реализацию, которая вызывается предварительно скомпилированными фреймворками, без их перекомпиляции, но в моем коде фактически моя реализация вызывается вместо той, что из objc-runtime.
Но эта строка
id retVal = 0;//objc_msgSendv(self, op, method_getSizeOfArguments(op), argptr)
закомментирована, так как она должна работать в objc 1.0, но в objc 2.0 objc_msgSendv () больше не доступна, так же, как method_getSizeOfArguments ().
Итак, есть ли способ сделать это, без необходимости перестраивать среду выполнения objc и без необходимости заново реализовывать исходное поведение objc_msg.Можно ли скопировать и вставить эти тысячи строк кода сборки, зависящих от платформы, из источника среды выполнения objc?
Я уже думал о функции __builtin_apply () GCC, чтобы вызвать оригинальную функцию objc_msgSend (), ноКажется, нет способа узнать размер в байтах параметров переменной, переданных objc_msgSend () для определенного вызова.