首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSInvocation返回零

NSInvocation返回零
EN

Stack Overflow用户
提问于 2014-09-08 22:31:03
回答 2查看 835关注 0票数 0

有人知道我如何将NSInvocation的论点设置为nil吗?我正在尝试使用OCMock,我希望这个期望返回为零。问题是,在调用方法时,我需要做一些其他的事情,正如您在示例中所看到的,这就是为什么我不执行andReturn:nil

我想这么做:

代码语言:javascript
复制
[[[myObject stub] andDo:^(NSInvocation *inv) {
   [inv setReturnValue:Nil];
   [inv invoke];
   [self notify:kXCTUnitWaitStatusSuccess]; //Code that I need to execute
}] myMethod:OCMOCK_ANY];

但我发现了一个错误:

代码语言:javascript
复制
 *** Terminating app due to uncaught exception 
 'NSInvalidArgumentException', reason: '-[NSInvocation setArgument:atIndex:]: 
 NULL address argument'

有谁知道还有什么办法可以把这个设定为零吗?或者如果它是不可能的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-09 05:52:27

@newacct指出了这一点,他是完全正确的。在实际调用之前,您不能设置调用的返回值。作为调用的结果,为了获得"nil“,我所做的是修改调用的参数,从而调用将调用的代码生成nil。让我用一个例子来解释:

代码语言:javascript
复制
- (void)viewDidLoad {
  NSString *arg = @"HelloWorld";

  NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(isHelloWorld:)]];
  [invocation setSelector:@selector(isHelloWorld:)];
  [invocation setTarget:self];
  [invocation setArgument:&arg atIndex:2];

  NSString *result1 = nil;
  [invocation invoke];
  [invocation getReturnValue:&result1];

  NSString *result2 = [self resultOfModifiedInvocation:invocation];

  NSLog(@"result 1: %@",result1);
  NSLog(@"result 2: %@",result2);
}

- (NSString *) resultOfModifiedInvocation:(NSInvocation *) invocation {
  NSString *aString = @"NoWorld";
  [invocation setArgument:&aString atIndex:2];

  [invocation invoke];
  [invocation getReturnValue:&aString];

  return aString;
}


- (NSString *) isHelloWorld:(NSString *) aString{
  if([aString isEqualToString:@"HelloWorld"])
    return aString;
  else
    return nil;
}

方法isHelloWorld:应该返回@"HelloWorld",因为我们在调用中发送的内容是正确的。这实际上是在您第一次调用调用时发生的,因为参数还没有被修改。另一方面,通过调用resultOfModifiedInvocation:,调用的参数会被修改,然后调用的结果就会不同。

这是示例的输出:

代码语言:javascript
复制
  > result 1: HelloWorld
  > result 2: (null)
票数 0
EN

Stack Overflow用户

发布于 2014-09-09 00:15:47

首先,您的代码没有真正的意义。应该在调用之前设置调用的参数,调用的方法将读取给定的参数,并设置返回值,然后在调用之后读取返回值。在调用之前设置返回值是没有意义的,因为根据定义,“返回值”是调用的结果“返回”的东西,并且将在调用结束时设置,覆盖之前设置的内容。

为了解决所得到的错误,对于所有的getArgumentsetArgumentgetReturnValuesetReturnValue函数,您需要传递一个指向要读取或写入值的缓冲区的指针。这是因为参数和返回值可以是不同的C类型,大小不同,因此无法直接传递它。在这种情况下,要读/写的值似乎是一个对象指针,因此您需要创建一个对象指针类型的变量,设置为您想要的值(在您正在设置的情况下),然后将指向该变量的指针传递给getArgument/setArgument/getReturnValue/setReturnValue.。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25734065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档