у iphone @selector есть два аргумента - PullRequest
1 голос
/ 23 сентября 2011

У меня есть такой метод:

-(void)A:(int)a B:(int)b{    
}

и я хочу поместить метод в новый поток:

NSInvocationOperation *theOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(A:B:) object:nil];

но "EXC_BAD_ACCESS".

Ответы [ 4 ]

3 голосов
/ 23 сентября 2011

Метод, который вы вызываете с помощью NSInvocationOperation, может принимать только один параметр, и этот параметр должен быть объектом Objective-C (например, NSNumber), а не простым типом C (например, int).

Как правило, для обработки нескольких параметров вы используете NSDictionary или NSArray для хранения параметров:

- (void)myMethod:(NSDictionary*)parameters 
{
    int a = [[parameters objectForKey:@"A"] intValue];
    int b = [[parameters objectForKey:@"B"] intValue];

    // do something with a and b
}


[[NSInvocationOperation alloc] 
    initWithTarget:self
          selector:@selector(myMethod:)
            object:[NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithInt:123], @"A",
                     [NSNumber numberWithInt:456], @"B",
                     nil]];

В качестве альтернативы, вы можете использовать объект NSInvocation для вызова вашего метода.Это допускает любое число и любой тип параметров, но обычно гораздо проще просто поместить ваши параметры в NSDictionary, чем создать объект NSInvocation.

Информация о том, как использовать NSInvocation.

1 голос
/ 23 сентября 2011

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

0 голосов
/ 23 сентября 2011

Вам не нужен второй B:

использование будет:

[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(A:) object:nil];
0 голосов
/ 23 сентября 2011

Из документов Apple: «Селектор, который вызывается при выполнении операции. Селектор может принимать 0 или 1 параметр;».Поэтому, если вы хотите вызвать метод с большим количеством параметров, создайте дополнительный метод с одним параметром и оттуда вызовите метод с большим количеством параметров.

...