Во-первых, обратите внимание, что параметр функции с именем i
и переменная с именем i
в main()
являются двумя разными переменными. Я думаю, что это не имеет большого значения для настоящей дискуссии, но важно знать.
Во-вторых, вы используете оператор постинкремента в fun()
. Это означает, что результатом выражения является значение до увеличения i
; конечное значение 11 из i
просто отбрасывается, и функция возвращает 10. Переменной i
обратно в main, являющейся другой переменной, присваивается значение 10, которое затем уменьшается, чтобы получить 9.
Проблема здесь не в передаче селектора в метод как таковой, а в передаче селектора там, где ожидается объект. Чтобы передать значение, не являющееся объектом, как объект, вы можете использовать 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
Используйте NSValue, например:
+(void)method1:(SEL)selector {
NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)];
[NSThread detachNewThreadSelector:@selector(method2:)
toTarget:self
withObject:selectorValue];
}
NSValue предназначен как объект-оболочка для произвольных типов, не являющихся объектами.
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];
}