2012-06-09 2 views
1

В моем приложении я использую performSelector для вызова методов. У меня есть три разных метода в моем приложении, я хочу, чтобы случайным образом я назначил один из этих трех методов для выполнения селектора. Вот мой код.Как выбрать случайный метод, используя селектор?

[self performSelector:@selector()]; 

Вот мои три метода ..

-(void)Act1 
{ 
} 

-(void)Act2 
{ 
} 

-(void)Act3 
{ 
} 

Теперь я хочу, чтобы назначить каждый раз, когда один метод случайным селектором. Может ли кто-нибудь вести меня, как я могу это сделать.

+1

1 до 3 генератора случайных чисел ... то если-то еще, если условие ... –

ответ

4

Это следует сделать это:

int rand = (arc4random() % 3) + 1; 
[self performSelector:NSSelectorFromString([NSString stringWithFormat:@"Act%d",rand])]; 
+0

когда я реализовать свой код он дает мне ошибку .. ошибка: ожидается «) 'before' ('токен – jamil

+0

@Albert: извините за это, я писал напрямую, я исправил код, это даст вам предупреждение о утечке - вы можете подавить это предупреждение #pragmas, о котором упоминает Станислав. –

+0

Thanx @rokjarc теперь его работа отлично. – jamil

3

Вы можете поместить 3 строки в массив, представляющий ваши методы, выбрать случайным образом один и использование Nsselectorfromstring, чтобы получить селектор

4

Используйте массив селекторов, SEL это их тип.

SEL mySelectors[3] = { @selector(Act1), @selector(Act2), @selector(Act3) }; 
[self performSelector:mySelectors[rand() % 3]]; 

Вы можете подавить предупреждение, вынесенное АРК о потенциальной утечке памяти, это безопасно, так как ваши методы void. Используйте objc_msgSend или обернуть код, как это:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
    [self performSelector:mySelectors[rand() % 3]]; 
#pragma clang diagnostic pop 
+0

Я реализую ваш метод, но каждый раз, когда он вызывает Act2. – jamil

+0

Это правильно, потому что вы должны инициализировать генератор случайных чисел с помощью 'srand()' перед использованием 'rand()', что даст вам такая же последовательность каждый раз e перезагружается, если вы не инициализируете его. –

Смежные вопросы