53798


performSelectorに、NSArrayで生成したランダムなメソッド（文字列）を代入し、そのメソッドに飛ばすにはどうすればよいでしょうか？下記のソースだとクラッシュします。

[code]

    - (void)trigger:(id)sender{
    NSArray *tone_array = [NSArray arrayWithObjects:@"method_1",@"method_2",@"method_3",@"method_4",nil];
    
        uint32_t rnd = (int)arc4random_uniform((int)[tone_array count]);
        NSString *rndMethod = [tone_array objectAtIndex:rnd];
    
        [self performSelector:@selector(rndMethod:) withObject:nil afterDelay:0];}
    
    - (void)method_1:(id)sender{
    
    //処理するアクション
    
    }
    
[/code]


CC BY-SA 4.0
2019-03-29T04:38:29.613
53796
2019-04-01T15:24:18.630
2019-03-29T13:07:03.537
2259
30839
question
ios objective-c iphone
objective-c の performSelector を使用したランダムなメソッドの呼び出しについて


`perfomSelector`の前に`NSSelectorFromString(メソッド名文字列)`を実行して、`SEL`型の変数に戻り値を代入して使います。

以下は、ボタンを押すと画面上の`calledMethodNameField`と言う名前で`IBOutlet`を繋いだ`label`に呼ばれた文字列と同じ名前のメソッドを呼び出して、ラベルにメソッドの名前を表示してみせるサンプルです。

[code]

        SEL currentSelector = NSSelectorFromString(currentMethodName);
        [self performSelector:currentSelector withObject:nil afterDelay:0.0];
    
[/code]

上の２行がキモになります。

[code]

    - (IBAction)testButtonPressed:(NSButton *)sender {
        NSArray<NSString *> *selectorNames = @[@"method1:", @"method2:", @"method2:", @"method3:", @"method4:"];
        NSUInteger rnd = arc4random_uniform((int)selectorNames.count);
    
        NSString *currentMethodName = selectorNames[rnd];
        SEL currentSelector = NSSelectorFromString(currentMethodName);
    
        [self performSelector:currentSelector withObject:nil afterDelay:0.0];
    }
    
    - (void) method1:(id) sender
    {
        calledMethodNameField.stringValue = @"method1";
    }
    
    - (void) method2:(id) sender
    {
        calledMethodNameField.stringValue = @"method2";
    }
    
    - (void) method3:(id) sender
    {
        calledMethodNameField.stringValue = @"method3";
    }
    
    - (void) method4:(id) sender
    {
        calledMethodNameField.stringValue = @"method4";
    }
    
[/code]


CC BY-SA 4.0
2019-03-29T08:35:26.250
53798
2019-04-01T15:24:18.630
2019-04-01T15:24:18.630
14745
14745
53796
answer