Подтвердить что ты не робот

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

Для метода:

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

Как пройти в @selector? Я попытался выполнить его (id), чтобы скомпилировать его, но он врезан во время выполнения.


В частности, у меня есть такой метод:

+(void)method1:(SEL)selector{
[NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selector];   
}

Сбой. Как передать селектор без сбоев, чтобы новый поток мог вызвать селектор, когда поток готов?

4b9b3361

Ответ 1

Проблема здесь заключается не в передаче селектора методу как таковой, а в передаче селектора, где ожидается объект. Чтобы передать значение без объекта в качестве объекта, вы можете использовать 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

Ответ 2

Вы можете конвертировать между селекторами и строковыми объектами с помощью функций NSStringFromSelector() и NSSelectorFromString(). Поэтому вы можете просто передать строковые объекты.

В качестве альтернативы, если вы не хотите изменять свои методы, вы можете создать NSInvocation для создания вызова для вызова метода (поскольку он может настраивать вызовы с аргументами, отличными от объекта), а затем вызвать его do [NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil];

Ответ 3

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

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

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

Ответ 5

Если вы не хотите указывать объект, просто используйте nil.

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

Если вам нужно передать объект в селектор, он будет выглядеть примерно так.

Здесь я передаю строку методу "setText".

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


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}