有人知道我如何将NSInvocation的论点设置为nil吗?我正在尝试使用OCMock,我希望这个期望返回为零。问题是,在调用方法时,我需要做一些其他的事情,正如您在示例中所看到的,这就是为什么我不执行andReturn:nil。
我想这么做:
[[[myObject stub] andDo:^(NSInvocation *inv) {
[inv setReturnValue:Nil];
[inv invoke];
[self notify:kXCTUnitWaitStatusSuccess]; //Code that I need to execute
}] myMethod:OCMOCK_ANY];但我发现了一个错误:
*** Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: '-[NSInvocation setArgument:atIndex:]:
NULL address argument'有谁知道还有什么办法可以把这个设定为零吗?或者如果它是不可能的?
发布于 2014-09-09 05:52:27
@newacct指出了这一点,他是完全正确的。在实际调用之前,您不能设置调用的返回值。作为调用的结果,为了获得"nil“,我所做的是修改调用的参数,从而调用将调用的代码生成nil。让我用一个例子来解释:
- (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:,调用的参数会被修改,然后调用的结果就会不同。
这是示例的输出:
> result 1: HelloWorld
> result 2: (null)发布于 2014-09-09 00:15:47
首先,您的代码没有真正的意义。应该在调用之前设置调用的参数,调用的方法将读取给定的参数,并设置返回值,然后在调用之后读取返回值。在调用之前设置返回值是没有意义的,因为根据定义,“返回值”是调用的结果“返回”的东西,并且将在调用结束时设置,覆盖之前设置的内容。
为了解决所得到的错误,对于所有的getArgument、setArgument、getReturnValue、setReturnValue函数,您需要传递一个指向要读取或写入值的缓冲区的指针。这是因为参数和返回值可以是不同的C类型,大小不同,因此无法直接传递它。在这种情况下,要读/写的值似乎是一个对象指针,因此您需要创建一个对象指针类型的变量,设置为您想要的值(在您正在设置的情况下),然后将指向该变量的指针传递给getArgument/setArgument/getReturnValue/setReturnValue.。
https://stackoverflow.com/questions/25734065
复制相似问题