你好,我对NSMutableArray的performSelector有一个棘手的麻烦。我有可能误解了performSelector的作用。 基本上我有NSMutableArray与对象(他们都是基于我的类的对象,从UIButton继承,但这并不重要,我猜),我需要发送消息到数组中的所有对象。对NSMutableArray的performSelector错误
在我的类的头文件中,我声明了函数,这是由选择器调用的。它看起来像这样:
-(void)scaleChangedWithANumber:(NSNumber *)scale;
在这个例子中我的数组包含3个对象。如果我的项目叫他们的项目,它可以完美运行:
NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];
ButtonOfElement *tmpButton1=[elementsButtonContainer objectAtIndex:0];
[tmpButton1 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
ButtonOfElement *tmpButton2=[elementsButtonContainer objectAtIndex:1];
[tmpButton2 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
ButtonOfElement *tmpButton3=[elementsButtonContainer objectAtIndex:2];
[tmpButton3 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
但是,如果我尝试调用performSelector的阵列(我需要发送消息到所有的对象数组):
NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];
[elementsButtonContainer performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
tmpNumber=nil;
我得到错误:
[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0'
*** First throw call stack:
(0x34e456c3 0x370be97f 0x34e49227 0x34e47951 0x34d9f468 0x31d1 0x369a70eb 0x369a7447 0x369324d9 0x368f9c0d 0x36ae5649 0x3681df4f 0x3681c9b3 0x3682791f 0x368274eb 0x36814f29 0x36814843 0x337425d3 0x33742203 0x34e1a593 0x34e1a537 0x34e193b9 0x34d8c39d 0x34d8c229 0x3374131b 0x368688f9 0x2363 0x2308)
libc++abi.dylib: terminate called throwing an exception
我可以使用循环,并呼吁通过课程的项目进行选择的项目,但我认为这将是更优雅,更清晰的使用performSelector的阵列。
这不是如何'-performSelector:'作品。你可以在NSArray上做一个类来做到这一点,但我认为C函数会更适合这个任务。 –
由于@ RichardJ.RossIII说'performSelector:'不能这样工作。 '[object performSelector:@selector(someMethod)]'或多或少等同于[object someMethod]'。在NSArray上调用一个仲裁方法不会将该方法转发给它的所有元素,这就是它崩溃的原因。看看kubi的回答,他有正确的想法。 –