2014-10-08 2 views
2

У меня есть Rectangle объект со следующим интерфейсом:цель C performselector с аргументами целочисленных объектов дает значение мусора

@interface Rectangle : NSObject 

    @property int height, width; 
    -(void) setWidth:(int)w andHeight: (int)h; 

@end 

У меня есть implementaion этого и объект (скажем r), сделанный из него. Когда я называю

[r setWidth: 5 andHeight: 6]; 

я получить правильные результаты, когда я проверяю через [r height]. Однако, когда я использую performselector сделать то же самое:

NSNumber *myNumber = [NSNumber numberWithInt:45]; 
[r performSelector:@selector(setWidth:andHeight:) withObject:myNumber 
      withObject:myNumber]; 

вызова [r height] печатает некоторые ценностные мусора (выглядит как какой-то адрес) вэнь ожидаемое значение является 45. Что я делаю неправильно?

+3

'NSNumber' не то же самое, как' int'. Ваш метод не принимает объекты NSNumber в качестве параметров. BTW - почему вы используете 'performSelector' вместо прямого вызова метода? – rmaddy

+0

он просто не поддерживается. –

+0

@maddy, нет особой причины, просто экспериментируйте. – SexyBeast

ответ

3

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

+1

... и если вам действительно необходимо косвенно вызвать метод с параметрами, отличными от объекта, используйте 'NSInvocation'. –

+0

Да @ gnasher729, я это узнал. Однако вы можете упомянуть, что я могу изменить подпись функции, чтобы принять NSNumbers вместо этого, и внутри них вывести из них фактическое целочисленное значение. Это будет работать. – SexyBeast

2

Как говорит gnasher, вы не можете этого сделать. Вы можете использовать NSInvocation или использовать GCD и блоки.

1

У меня была аналогичная проблема и она была решена с использованием NSInvocation.
код что-то вроде следующего должно работать, хотя он стал многословным:

SEL selector = NSSelectorFromString(@"setWidth:andHeight:"); 
NSMethodSignature *signature = [r methodSignatureForSelector:selector]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:selector]; 
int x = 5; 
int y = 6; 
[invocation setArgument:&x atIndex:2]; // 0 and 1 are reserved 
[invocation setArgument:&y atIndex:3]; 
[invocation invokeWithTarget:r];