为什么选择器不需要将参数传递给采用参数的方法?

时间:2019-09-30 10:38:35

标签: objective-c xcode arguments parameter-passing selector

我正在研究一个项目,试图掌握代码。我刚遇到#selector。据我了解,selectors调用方法(当然,我敢肯定还有更多方法)。

令我震惊的是,即使selector本身接受了argumentmethod调用也没有将method传递给parameter 。该代码工作正常,因此我认为这是使用selector的正常行为。这是代码示例:

[Communication sendVerifyNumber:ps.address verificationCode:@""
             withCallbackMethod:@selector(numberVerificationCallCompleted:)
             callbackFailMethod:@selector(numberVerificationCallFailed:) onObject:self];
}

还有numberVerificationCallCompleted

-(void)numberVerificationCallCompleted:(NSNumber*)responseNumber{...}

所以,我的问题是,selectors是不是这样?我的意思是,为什么要使用它们?以及它如何运作? method仍需要argument才能正常工作,所以它必须来自某个地方,对吧?

1 个答案:

答案 0 :(得分:2)

选择器描述 Objective-C类中的方法,使您可以在以后的时间点调用它。参数在调用时传递,而不是在描述时传递。

您将选择器存储为SEL类型,并使用performSelector:进行调用,使其非常适合用作回调。

上面显示的方法将执行以下操作:

- (void)sendVerifyNumber:(NSString*)address
        verificationCode:(NSString*)verificationNumber
      withCallbackMethod:(SEL)callbackMethod
      callbackFailMethod:(SEL)failedCallbackMethod
                onObject:(id)callbackObject
{
    BOOL success = doWhateverIDo();
    if (success) {
        [callbackObject performSelector:callbackMethod
                             withObject:someArgumentToPassback];
    } else {
        [callbackObject performSelector:failedCallbackMethod
                             withObject:someArgumentToPassback];
    }
}

注意:如果选择器采用零,一个或两个参数(分别使用performSelector:performSelector:withObject:performSelector:withObject:withObject:,则只能调用选择器描述的方法。

>