iPhone:performSelector与BOOL参数?

Jim*_*Jim 41 iphone

有没有办法在选择器中发送BOOL?

[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];
Run Code Online (Sandbox Code Playgroud)

或者我应该使用NSInvocation?有人可以写一个样品吗?

Tom*_*ift 65

如果你不能改变目标方法签名来接受a NSNumber代替BOOL你可以使用NSInvocation而不是performSelector:

MyTargetClass* myTargetObject;
BOOL myBoolValue = YES; // or NO

NSMethodSignature* signature = [[myTargetObject class] instanceMethodSignatureForSelector: @selector( myMethodTakingBool: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: myTargetObject];
[invocation setSelector: @selector( myMethodTakingBool: ) ];
[invocation setArgument: &myBoolValue atIndex: 2];
[invocation invoke];
Run Code Online (Sandbox Code Playgroud)

  • @quickthyme - 我相信调用 invoke 是同步的。 (3认同)
  • 是的,但是您的示例虽然正确,但假定在创建调用本身的同一块中调用“invoke”。然而,在其他地方调用“invoke”的情况下(更常见),本地“myBoolValue”变量可能不再存在。因此,任何引用它的地址指针都不再值得信赖。因此,最好将指针传递给静态变量或实例变量。你的回答没问题。我只是觉得这是一个值得一提的重要细节,以防以后可以为其他人省去巨大的麻烦...... (2认同)

Niv*_*Niv 56

你可以使用NSNumber来包装bools类型:

BOOL myBool = YES;
NSNumber *passedValue = [NSNumber numberWithBool:myBool];
[self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5];
Run Code Online (Sandbox Code Playgroud)

在选择器中,要获取bool值,请使用:

BOOL value = [recievedObject boolValue];
Run Code Online (Sandbox Code Playgroud)

  • 如果您能够操纵目标选择器的签名,这很好.如果不是,您应该使用NSInvocation. (13认同)
  • 警告:我注意到在某些条件下执行performSelector并为BOOL传递NSNumber可能会在您稍后请求该BOOL属性时给出不明确的结果.它似乎持有NSNumber(或一些数值)的ref,而不是实际的BOOL. (3认同)

mal*_*lex 19

最简单的方法如下:

如果你有方法

-(void)doSomething:(BOOL)flag
Run Code Online (Sandbox Code Playgroud)

并希望执行带有flag = NO使用的Selecor

[object performSelector:@selector(doSomething:) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

如果是flag = YES,您可以发送任何对象,例如@YES - 来自bool的数字

 [object performSelector:@selector(doSomething:) withObject:@YES];
Run Code Online (Sandbox Code Playgroud)

注意:不要使用@NO!在bool参数的方法中,只有nil会被解释为NO.


小智 14

在主线程中使用dispatch_after,如下所示:

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (_animationDuration+1) * NSEC_PER_SEC);
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
    [self completeAnimation:NO];
});
Run Code Online (Sandbox Code Playgroud)


Gon*_*Oin 6

如果你想传递NO,只有NO,你可以改为零

[self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];
Run Code Online (Sandbox Code Playgroud)

但请记住,只需工作为零,不用ARC编译,不允许隐式转换


zvj*_*a24 5

另一种方法是传递nilfor NOanything elseforYES

[self performSelector:@selector(doSomething :) withObject:nil];

doSomething for BOOL参数将具有NO值

-

[self performSelector:@selector(doSomething :) withObject:[NSNumber numberWithBool:YES]];

doSomething for BOOL参数将具有YES值

-

[self performSelector:@selector(doSomething :) withObject:[NSNumber numberWithBool:NO]];

doSomething for BOOL参数将具有YES值(甚至传递的数字为NO)