【问题标题】:Get arguments of objective-c method by index通过索引获取objective-c方法的参数
【发布时间】:2011-11-05 17:59:17
【问题描述】:

我知道objective-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),以便我可以传递它们或枚举它们?

编辑:我想用现有的方法来做到这一点,例如我无法更改的委托方法。

【问题讨论】:

  • 也许你可以用 ObjC 块做到这一点。
  • 这实际上是一个非常困难的问题。
  • @DaveDeLong,如果这么说,那对我来说是不可能的;)
  • @Jonathan。是的,可能获取当前方法调用的NSInvocation,但需要很多工作。
  • @DaveDeLong,我现在只是很好奇,我想我在任何地方都找不到更多关于这个的信息?

标签: objective-c c


【解决方案1】:

使用 NSInvocation;它可以封装一组几乎任意的参数、一个选择器和一个目标,然后可以在以后以直接的方式调用它们。

或者,使用块。您可以将调用封装在块中,捕获所需的任何状态,同时将其余状态作为参数传递。

您尝试做的通常是表明设计/架构问题。您不需要这样做。

但是,在某些情况下,出于任何原因(通常是合同性的——去过那里,做过,确切地知道合同如何规定糟糕的编码实践的需要)。


但它也可以访问当前方法的参数吗?

“有点。”

不清楚你在问什么。如果“当前方法”不是您实现的,那么您几乎无能为力(除了 swizzling 或其他真正不应该使用的运行时游戏)。

如果它是您已经实现的,只需使用参数即可。如果您想延迟执行(或块),可以在 NSInvocation 中对它们进行编码。

NSInvocation 用于在特定情况下获取参数;特别是在实现方法转发时。但这似乎与您尝试做的事情无关。

【讨论】:

  • 我知道 NSInvocation 可以用来发送消息(/调用方法),但它也可以访问当前方法的参数吗?
【解决方案2】:

参数传递的机制取决于体系结构,可能涉及在寄存器、堆栈或两者中传递值。出于调试目的以外的任何目的尝试动态地找出参数列表可能不是一个好主意,当然也不能移植。

我认为这篇文章是深入了解如何传递参数的一个很好的起点:http://en.wikipedia.org/wiki/Calling_convention

【讨论】:

    【解决方案3】:

    尝试创建一个接收这些参数的 NSArray 的函数。您可以在不传入 self 或 _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.
      }
    
    }
    

    【讨论】:

    • 对不起,我想用现有的方法来做这个,而不是创建新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2012-08-20
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多