Как регистрировать аргументы во время выполнения? - PullRequest
1 голос
/ 22 июня 2011

Я создал новую функцию для регистрации каждого метода из класса во время выполнения.

Проблема, которая у меня есть, в этой строке:

id value = va_arg(stackFrame, id);

Не преобразует тип объекта в аргументах.

Есть идеи, что я делаю не так? Есть ли другой способ сделать это?

void DebugArguments ( id self, SEL _cmd,...)

{

id receiver = self;
SEL receiverSelector = _cmd;

va_list stackFrame;

va_start(stackFrame, _cmd);

NSMethodSignature *signature
= [receiver methodSignatureForSelector:receiverSelector];

NSUInteger count = [signature numberOfArguments];

NSUInteger index = 2;

for (; index < count; index++)
{

    id value = va_arg(stackFrame, id);
        if (!value)
        {
            NSLog(@"Arguments: %@",value);    
        }
} 
va_end(stackFrame);

}

1 Ответ

1 голос
/ 22 июня 2011

Я вызываю функцию InitDebug из такого класса: (void) MyTest: (NSString *) строка {
InitDebug (self, _cmd); } Я надеюсь войти строку аргумента из метод MyTest.

В будущем будет полезно показать весь код.

В любом случае, вы не можете этого сделать; когда вы вызываете InitDebug(...), вы помещаете новый кадр в стек, и va_arg() будет декодировать в контексте этого кадра, а не в окружающем кадре. Вы также не можете «подняться в стек» и начать копаться в аргументах вызывающего фрейма, поскольку нет гарантии, что вызывающий фрейм даже сохранится в этой точке.

Если вы действительно хотите сделать что-то подобное, вы, вероятно, захотите создать подкласс NSProxy и использовать его в качестве прокси между вызывающей стороной и любым объектом, который вы хотите зарегистрировать. Затем вы можете использовать встроенный механизм пересылки Objective-C, чтобы разобраться с аргументами.

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