iOSにおけるperform + @selectorによる多重引数の渡し方
iOSでは、performSelectorメソッドを使ってメソッドを呼び出すことができますが、パラメータは1つしか受け取れません。パラメータを複数渡す必要がある場合は、パラメータをオブジェクトにカプセル化する方法で実現できます。
サンプルコードを以下に示します。
- (void)methodWithMultipleParameters:(NSString *)param1 param2:(NSInteger)param2 {
NSLog(@"param1 = %@, param2 = %ld", param1, (long)param2);
}
- (void)performSelectorWithMultipleParameters {
NSString *param1 = @"Hello";
NSInteger param2 = 123;
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(methodWithMultipleParameters:param2:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(methodWithMultipleParameters:param2:)];
[invocation setArgument:¶m1 atIndex:2];
[invocation setArgument:¶m2 atIndex:3];
[invocation invoke];
}
performSelectorWithMultipleParameters メソッドでは、まずメソッドに渡す引数 param1 と param2 を準備します。次に、NSInvocation を使ってメソッド methodWithMultipleParameters:param2: を呼び出します。メソッドのシグネチャを methodSignatureForSelector メソッドで取得し、NSInvocation オブジェクトを作成してターゲット、セレクタ、引数を設定します。最後に、invoke メソッドでメソッドを呼び出します。
「methodWithMultipleParameters:param2:」メソッドでは、受け渡されたパラメータの値を出力することができます。
関連資料:
- NSInvocation
- メソッド署名