Создание селектора от имени метода с параметрами

57
задан Josh Caswell 11 October 2013 в 19:22
поделиться

3 ответа

SEL является типом, который представляет селектор в Objective C. @selector () ключевое слово возвращает SEL, который Вы описываете. Это не указатель функции, и Вы не можете передать его никакие объекты или ссылки никакого вида. Для каждой переменной в селекторе (метод) необходимо представить это в вызове к @selector. Например:

-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);

-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted

Селекторы обычно передаются методам делегата и обратным вызовам для определения, какой метод нужно назвать на конкретном объекте во время обратного вызова. Например, при создании таймера метод обратного вызова конкретно определяется как:

-(void)someMethod:(NSTimer*)timer;

Поэтому при планировании таймера Вы использовали бы @selector для определения, какой метод на объекте на самом деле будет ответственен за обратный вызов:

@implementation MyObject

-(void)myTimerCallback:(NSTimer*)timer
{
    // do some computations
    if( timerShouldEnd ) {
      [timer invalidate];
    }
}

@end

// ...

int main(int argc, const char **argv)
{
    // do setup stuff
    MyObject* obj = [[MyObject alloc] init];
    SEL mySelector = @selector(myTimerCallback:);
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
    // do some tear-down
    return 0;
}

В этом случае Вы определяете что объект obj передаваться с myTimerCallback каждые 30 секунд.

100
ответ дан erkanyildiz 24 November 2019 в 19:29
поделиться

Вы не можете передать параметр в @selector ().

похоже, что Вы пытаетесь реализовать обратный вызов. Лучший способ сделать, который был бы чем-то вроде этого:

[object setCallbackObject:self withSelector:@selector(myMethod:)];

Тогда в setCallbackObject:withSelector Вашего объекта: метод: можно назвать метод обратного вызова.

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}
18
ответ дан grahamparks 24 November 2019 в 19:29
поделиться

Вне того, что уже было сказано о селекторах, можно хотеть посмотреть на класс NSInvocation.

NSInvocation является сообщением Objective C, представленным статичным, то есть, это - действие, превратился в объект. Объекты NSInvocation привыкли к сообщениям промежуточной буферизации между объектами и между приложениями, прежде всего, объектами NSTimer и распределенной системой объектов.

объект NSInvocation содержит все элементы сообщения Objective C: цель, селектор, аргументы и возвращаемое значение. Каждый из этих элементов может быть установлен непосредственно, и возвращаемое значение установлено автоматически, когда объект NSInvocation диспетчеризируется.

Имеют в виду, что, в то время как это полезно в определенных ситуациях, Вы не используете NSInvocation в нормальный день кодирования. Если Вы просто пытаетесь получить два объекта говорить друг с другом, рассмотреть определение неофициального или формального протокола делегата или передачу селекторного и целевого объекта, как был уже упомянут.

5
ответ дан Marc Charbonneau 24 November 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: