Получить аргументы метода target-c по индексу - PullRequest
3 голосов
/ 05 ноября 2011

Я знаю, что методы target-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: Я хочу сделать это с существующими методами, например, делегировать методы, которые я не могу изменить.

Ответы [ 3 ]

4 голосов
/ 05 ноября 2011

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

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

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

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

<Ч />

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

"Вроде".

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

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

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

1 голос
/ 05 ноября 2011

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

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

0 голосов
/ 05 ноября 2011

Попробуйте создать функцию, которая принимает 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.
  }

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