Почему селекторам не нужно передавать аргументы в методы, которые принимают параметры? - PullRequest
1 голос
/ 30 сентября 2019

Я изучаю проект, пытаюсь получить контроль над кодом. Я только что прибежал к #selector. Насколько я понимаю, selectors вызывают методы (я уверен, что это еще не все).

Одна вещь, которая поразила меня, это то, что вызов selector не передает argument на method, хотя сам 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 Ответ

2 голосов
/ 30 сентября 2019

Селектор описывает метод в классе 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: соответственно).

...