Получить аргументы метода object-c по индексу

Я знаю, что методы object-c на самом деле являются функциями c, а первые два аргумента – self и _cmd. Я пытаюсь получить остальные аргументы как массив (включая или исключая, self и _cmd)

Например:

-(void)someMethod:(id)firstArg withObject:(id)secondArg andObject:(id)thirdArg { //then something like: args[0] //corresponds to self args[1] //corresponds to _cmd args[2] //corresponds to firstArg args[3] //corresponds to secondArg args[3] //corresponds to thirdArg //or just start from firstArg being the 0th item in the index (skipping out self and _cmd) } 

То, что я пытаюсь сделать, это что-то вроде:

 [self doOtherMethod:@selector(otherMethod:withObject:andObject:) withObjects:args]; 

Итак, как я могу получить массив (c массив или даже NSArray) аргументов, переданных методу, чтобы я мог их передать или перечислить через них?

EDIT: Я хочу сделать это с помощью существующих методов, например, делегировать методы, которые я не могу изменить.

Механизм передачи аргументов зависит от архитектуры и может включать передающие значения в регистрах, в стеке или и то, и другое. Попытка вывести список аргументов динамически для чего угодно, кроме отладочных целей, вероятно, не очень хорошая идея и, конечно же, не переносимая.

Вот статья, которая, я думаю, станет отличной отправной точкой для получения более глубокого понимания того, как передаются аргументы: http://en.wikipedia.org/wiki/Calling_convention

Использовать NSInvocation; он может инкапсулировать почти произвольный набор аргументов, селектор и цель, которые затем могут быть вызваны позже простым способом.

Альтернативно, используйте блоки. Вы можете инкапсулировать вызов внутри блока, захватывая любое состояние, в котором вы нуждаетесь, передавая остальное в качестве аргументов.

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

Тем не менее, безусловно, существуют случаи, когда это требуется по ряду причин (по договору – там, что сделано, точно знать, как контракт может диктовать необходимость ужасных методов кодирования).


но может ли он также получить доступ к аргументам текущего метода?

“Вроде, как бы, что-то вроде.”

Непонятно, что вы просите. Если «текущий метод» – это не тот, который вы реализовали, то вы можете сделать очень мало (за исключением swizzling или других игр во время выполнения, которые никогда не должны использоваться никогда).

Если это тот, который вы реализовали, просто используйте аргументы. Вы можете закодировать их в NSInvocation, если вы хотите отложить выполнение (или блок).

NSInvocation используется для захвата аргументов в конкретном случае; в частности, при реализации метода пересылки. Но это не связано с тем, что вы пытаетесь сделать.

Попробуйте создать функцию, которая принимает NSArray этих аргументов. Вы можете сделать это, не переходя в себя или _cmd.

 - (void)serverRespondedWithJSONObjects:(NSArray *)objects { NSMutableArray *objects = [NSMutableArray array]; for (NSDictionary *dictonary in objects) { SomeObject *object = [[[SomeObject alloc] init] autorelease]; object.name = [dictionary valueForKey:@"name"]; [objects addObject:object]; } [self doSomethingWithArgs:objects]; } - (void)doSomethingWithArgs:(NSArray *)args { for (SomeClass *someObject in args) { //do something interesting with someObject. } }