getArgument:atIndex:
番号で指定した引数の値をコピーします
-(void)getArgument:(void *)buffer: atIndex:(int)index:
解説
番号で指定した引数の値をコピーします。
指定する番号のうち0はself、1は_cmdになっています(デバッガを見てください)ので、2以降が通常見える引数となります。
引数を一つ持つメソッドに値を渡したいときは、番号2をセットします。
指定する番号がメソッドの引数の数より多いときはNSInvalidArgumentExceptionを起こします。
バッファに必要なサイズを決めるためにはNSMethodSignatureのmethodReturnLengthメソッドを使用します。
NSArgumentInfo argInfo = [[anInvocation methodSignature] argumentInfoAtIndex:2]; buffer = (void *)malloc(argInfo.size);
返り値
( void )
なし
引数
( void * )buffer
バッファのポインタ
C文字列で引数・返り値のタイプが表される
NSString *などのオブジェクト @
NSString **などオブジェクトのポインタ ^@
BOOL c
int i
float f
SEL :
NSInteger i
( int )index
値を得る引数のインデックス値
0:self(隠れている)
1:_cmd(隠れている)
2:以降が通常見える引数
たとえば-(void) testSelector002:(NSString *)string というメソッドの場合、
(NSString *)stringはindex=2の引数になります。
フレームワーク
Foundation
クラス
NSInvocation
Instance Methods
使用可能
10.0
参照
- setArgument:atIndex:
- numberOfArguments (NSMethodSignature)
例文
#pragma mark NSInvocation getArgumentTypeAtIndex: -(void) testSelector003:(NSString *)string { NSLog(@"...call %s %@",__FUNCTION__,string); } -(void)method003 { SEL aSelector = @selector( testSelector003: );//セレクタをセット NSMethodSignature *aSignature = [ self methodSignatureForSelector:aSelector ];//セレクタのシグネチャをセット NSInvocation *anInvocation = [ NSInvocation invocationWithMethodSignature:aSignature ];//起動オブジェクトをセット //起動オブジェクトにターゲットと引数をセットする [ anInvocation setTarget: self ];//ターゲットはself [ anInvocation setSelector: aSelector ];//セレクタをセット NSMethodSignature *methodSignature = [anInvocation methodSignature]; NSInteger counter = [methodSignature numberOfArguments]; for (NSInteger i=0; i<counter; i++) { const char *argInfo = [methodSignature getArgumentTypeAtIndex:i]; NSString *str = [NSString stringWithCString:argInfo encoding:NSASCIIStringEncoding]; NSLog(@"%s %@",__FUNCTION__,str); } //-(void) testSelector003:(NSString **)stringについての情報 //=>-[OOOAppDelegate method001] @ //引数0 self @オブジェクト //=>-[OOOAppDelegate method001] : //引数1 _cmd :セレクタ //=>-[OOOAppDelegate method001] @ //引数2 (NSString *) @オブジェクト //@encode(@)などでタイプが表せる //NSString * @ //NSString ** ^@ //BOOL c //int i //float f //SEL : //NSInteger i }||< >|objc| #import "MyObject.h" @implementation MyObject - (IBAction)myAction:(id)sender { id aSignature ;//メソッドシグネチャ id invocation ;//起動オブジェクト SEL aSelector ;//セレクタ int aBuffer=5; //セレクタをセット aSelector = @selector( timerControl: ); //セレクタのシグネチャをセット aSignature = [ self methodSignatureForSelector:aSelector ]; //起動オブジェクトを作る invocation = [ NSInvocation invocationWithMethodSignature:aSignature ]; //ターゲットはself [ invocation setTarget: self ];//ターゲットはself //セレクタをセット [ invocation setSelector: aSelector ]; //引数インデックス2(通常の第一引数)にaBufferのポインタを渡す [ invocation setArgument:&aBuffer atIndex:2]; //起動する [ invocation invoke ]; } -(void) timerControl:(int)arg { NSLog(@"%d",arg); } @end