Как я передаю @selector в качестве параметра?

Во-первых, обратите внимание, что параметр функции с именем i и переменная с именем i в main() являются двумя разными переменными. Я думаю, что это не имеет большого значения для настоящей дискуссии, но важно знать.

Во-вторых, вы используете оператор постинкремента в fun(). Это означает, что результатом выражения является значение до увеличения i; конечное значение 11 из i просто отбрасывается, и функция возвращает 10. Переменной i обратно в main, являющейся другой переменной, присваивается значение 10, которое затем уменьшается, чтобы получить 9.

51
задан JOM 26 September 2012 в 23:35
поделиться

4 ответа

Проблема здесь не в передаче селектора в метод как таковой, а в передаче селектора там, где ожидается объект. Чтобы передать значение, не являющееся объектом, как объект, вы можете использовать NSValue . В этом случае вам необходимо создать метод, который принимает NSValue и извлекает соответствующий селектор. Вот пример реализации:

@implementation Thing
- (void)method:(SEL)selector {
    // Do something
}

- (void)methodWithSelectorValue:(NSValue *)value {
    SEL selector;

    // Guard against buffer overflow
    if (strcmp([value objCType], @encode(SEL)) == 0) {
        [value getValue:&selector];
        [self method:selector];
    }
}

- (void)otherMethodShownInYourExample {
    SEL selector = @selector(something);
    NSValue *selectorAsValue = [NSValue valueWithBytes:&selector objCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(methodWithSelectorValue:) toTarget:self withObject:selectorAsValue];
}
@end
67
ответ дан 7 November 2019 в 09:59
поделиться

Используйте NSValue, например:

+(void)method1:(SEL)selector {
    NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(method2:) 
                             toTarget:self 
                           withObject:selectorValue];
}

NSValue предназначен как объект-оболочка для произвольных типов, не являющихся объектами.

4
ответ дан 7 November 2019 в 09:59
поделиться

If you don't want to specify an object just use nil.

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];

If you need to pass an object to the selector it would look something like this.

Here I'm passing a string to the method "setText".

NSString *string = @"hello world!";
 [NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:string];


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}
0
ответ дан 7 November 2019 в 09:59
поделиться