NSMethodSignatureクラス
解説
継承 | NSObject |
準拠 | NSObject (NSObject) |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | OS X v10.0以降 |
iOS 2.0以降 | |
定義 | NSMethodSignature.h |
概要
メソッドシグネチャオブジェクトはメソッドの引数と返り値の情報を保持します。
iOSでは主にNSInvocationのエンコードに用いられます。
Objective-Cタイプの一例
NSString * @
NSString ** ^@
BOOL c
int i
float f
SEL :
NSInteger i
NSNull {NSNull=#}
NSRange {_NSRange=II}
Objective-Cタイプを調べるには下記のようなコードで調べることができます。
NSLog(@"objcType: %s", @encode(NSRange));
メソッドシグネチャの情報はプライベートメソッド(debugDescription)で知ることができます。
NSString *string = @"string"; NSMethodSignature * aSignature = [string methodSignatureForSelector:@selector(compare:options:range:)]; NSLog(@"%@", [aSignature debugDescription]);//プライベートメソッド
メソッドシグネチャオブジェクトの作成
Objective-Cタイプからメソッドシグネチャを作成するには(+ signatureWithObjCTypes)メソッドを使用します。
引数には、返り値・'self・_cmd'・見えている引数1・見えている引数2…の順で表記したObjective-CタイプのC文字列を渡します。(例えば、"@:@@" のように)
#pragma mark NSMethodSignature -(void) testSelector002:(NSString *)string { NSLog(@"...call %s %@",__FUNCTION__,string); } -(void)method002 { NSString *types = [NSString stringWithFormat:@"%s%s%s%s", @encode(id), // 返り値 @encode(id), // (隠れ)引数0 'self' @encode(SEL), // (隠れ)引数1 _cmd @encode(id) // 引数2(見えてる引数の1番目) ]; NSMethodSignature* aSignature = [NSMethodSignature signatureWithObjCTypes:[types UTF8String]]; NSInteger counter = [aSignature numberOfArguments]; for (NSInteger i=0; i<counter; i++) { const char *argInfo = [aSignature getArgumentTypeAtIndex:i]; NSString *str = [NSString stringWithCString:argInfo encoding:NSASCIIStringEncoding]; NSLog(@"%s %d = %@",__FUNCTION__,i,str); } //=>-[OOOAppDelegate method002] 0 = @ //=>-[OOOAppDelegate method002] 1 = : //=>-[OOOAppDelegate method002] 2 = @ NSLog(@"%s returntype = %s",__FUNCTION__,[aSignature methodReturnType]); //=>-[OOOAppDelegate method002] returntype = @ }
引数タイプの情報を得る
指定した順番の引数のタイプを取得するには(– getArgumentTypeAtIndex)メソッドを使用します。引数の数がいくつあるかを調べるには(– numberOfArguments)メソッドを使用します。
スタック上で占有するフレーム長を取得するには(– frameLength)メソッドを使用します。
返り値情報の取得
返り値のタイプを取得するには(– methodReturnType)メソッドを。返り値の長さを取得するには(– methodReturnLength)メソッドを使用します。
同期状態
ワンウエイかどうかを取得するには(– isOneway)メソッドを使用します。分散オブジェクトを通して呼び出された場合にYESを返します。その場合は応答を待ちません。
適合するプロトコル
サブクラス化の注意