performSelector при ошибке NSMutableArray

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

В заголовочном файле моего класса я объявил функцию, которая вызывается селектором. Это выглядит так:

-(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

Я, конечно, могу использовать цикл и вызывать селектор выполнения, элемент за элементом, но я подумал, что будет более элегантно и нагляднее использовать метод выполнения в массиве.


person André    schedule 11.09.2012    source источник
comment
Это не так, как -performSelector: работает. Вы можете создать категорию на NSArray для этого, но я думаю, что функция C лучше подходит для этой задачи.   -  person Richard J. Ross III    schedule 12.09.2012
comment
Как говорит @ RichardJ.RossIII, performSelector: так не работает. [object performSelector:@selector(someMethod)] более или менее эквивалентен [object someMethod]. Вызов метода арбитража в NSArray не пересылает этот метод всем его элементам, поэтому он дает сбой. Посмотрите на ответ Куби, он прав.   -  person Carl Veazey    schedule 12.09.2012


Ответы (2)


Попробуй это:

[elementsButtonContainer makeObjectsPerformSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
person kubi    schedule 11.09.2012
comment
Это именно то, что мне нужно :) Большое спасибо. И спасибо Ричарду и Карлу за объяснение. - person André; 12.09.2012

elementsButtonContainer не имеет метода с именем scaleChangedWithANumber. Вам нужно объявить его с другой логикой или вызвать существующий метод для всех подклассов кнопок в массиве.

person adc    schedule 11.09.2012