macOS/iOS API解説

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

目次

NSMethodSignatureクラス

INDEX>Foundation>

apple(mac)
apple(iOS)

解説

継承 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を返します。その場合は応答を待ちません。

適合するプロトコル

メソッド

メソッドシグネチャオブジェクトを作成

+ signatureWithObjCTypes

返り値タイプの情報を取得

– methodReturnType
– methodReturnLength

同期状態の調査

– isOneway

サブクラス化の注意