当前方法的NSInvocation的getArgument始终返回null

时间:2012-01-29 13:36:55

标签: objective-c null nsinvocation

我想获取当前函数的参数名称,以便我可以准备从文件系统加载该对象(如果当前实例中不存在)。 (例如,如果[foo dictTest]不可用,我想将之前保存的plist版本加载到ivar中)

我想通过提供我作为当前函数的参数提供的ivar名称来查找该文件。

这是功能代码:

-(NSDictionary*)getCachedDictionary:(NSDictionary*)dict{

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]];
    NSString * firstArgument = nil;
    [invocation getArgument:&firstArgument atIndex:2];
    NSLog(@"Trying to get the objects ivar %@",firstArgument);

    // right now during testing return nil
    return nil;
   }

一旦代码到达NSLog,我就会从firstArgument获得一个空值。

为什么?是否有可能我必须等待完全调用我当前的方法或者实际上更好地创建一个代理函数,它通过调用setArgument提供的ivar名称来调用我的类方法,以便我可以像我想的那样使用那个参数字符串吗?

提前多多感谢!

P.S。:在这个特定的例子中,我不想使用KVC来识别ivar并将其归还。

2 个答案:

答案 0 :(得分:2)

您误解了NSInvocation API。 +[NSInvocation invocationWithMethodSignature:]创建一个新的NSInvocation,它被键入以接受方法签名定义的类型的参数。它 not 返回与当前方法调用相对应的NSInvocation。这很容易理解为什么:

- (void)doBar:(id)bip {
  NSLog(@"hi there!")
}

- (void)doFoo {
  NSMethodSignature *sig = [self methodSignatureForSelector:@selector(doBar:)];
  NSInvocation *i = [NSInvocation invocationWithMethodSignature:sig];
}

当您在doFoo方法中为doBar:方法创建调用时,很明显可以看到参数必须为空,因为doBar:没有已被执行,因此没有争论。将@selector(doBar:)更改为_cmd不会神奇地改变任何内容。

接下来的问题是:有一种方法可以获得当前方法调用的NSInvocation吗?从来没听说过。 NSInvocation是一个非常复杂的类,从当前方法构造一个将是一场噩梦。

我强烈建议找一种不同的方法去做你想做的事情。

答案 1 :(得分:1)

即使这个问题很老并且已经回答,这里有一个链接,它提供了一种简单而优雅的方法来为编译时已知的任何选择器/方法创建一个调用实例:

http://www.cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html