macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

getArgument:atIndex:

INDEX>Foundation>NSInvocation

番号で指定した引数の値をコピーします
-(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の引数になります。

クラス

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