zoukankan      html  css  js  c++  java
  • 函数签名与消息转发:NSInvocation与NSMethodSignature

    具体可见 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html

    //规则: 返回值 函数名: 具体参数个数 如 (NSString*)fun1:(NSString*)param1对应 “@@:@”,打印如下

    <NSMethodSignature: 0x7a2dc790>
        number of arguments = 3
        frame size = 12
        is special struct return? NO
        return value: -------- -------- -------- --------
            type encoding (@) '@'
            flags {isObject}
            modifiers {}
            frame {offset = 0, offset adjust = 0, size = 4, size adjust = 0}
            memory {offset = 0, size = 4}
        argument 0: -------- -------- -------- --------
            type encoding (@) '@'
            flags {isObject}
            modifiers {}
            frame {offset = 0, offset adjust = 0, size = 4, size adjust = 0}
            memory {offset = 0, size = 4}
        argument 1: -------- -------- -------- --------
            type encoding (:) ':'
            flags {}
            modifiers {}
            frame {offset = 4, offset adjust = 0, size = 4, size adjust = 0}
            memory {offset = 0, size = 4}
        argument 2: -------- -------- -------- --------
            type encoding (@) '@'
            flags {isObject}
            modifiers {}
            frame {offset = 8, offset adjust = 0, size = 4, size adjust = 0}
            memory {offset = 0, size = 4}

    @property (readonly) NSUInteger numberOfArguments;

    //参数个数

    - (const char *)getArgumentTypeAtIndex:(NSUInteger)idx NS_RETURNS_INNER_POINTER;

    //取参数类型

    @property (readonly) NSUInteger frameLength;


    - (BOOL)isOneway;

    @property (readonly) const char *methodReturnType NS_RETURNS_INNER_POINTER;

    //返回值类型

    @property (readonly) NSUInteger methodReturnLength;

    //返回长度

    二、NSInvocation对原来签名的方法执行新的方法,必须指定Selector和Target,invoke或invokeWithTarget执行

    + (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)sig;
    //类方法 生成签名方法实例
    @property (readonly, retain) NSMethodSignature *methodSignature;
    //返回包装的签名方法
    - (void)retainArguments;
    @property (readonly) BOOL argumentsRetained;

    @property (nullable, assign) id target;

    //返回对象

    @property SEL selector;
    //返回包装的SEL
    - (void)getReturnValue:(void *)retLoc;

    //返回签名方法的返回值

    - (void)setReturnValue:(void *)retLoc;

    //设置签名方法的返回值
    - (void)getArgument:(void *)argumentLocation atIndex:(NSInteger)idx;

    //返回签名方法的参数 index=2,取第一个参数

    - (void)setArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
    //设置签名方法参数
    - (void)invoke;

    //执行方法

    - (void)invokeWithTarget:(id)target;

    //指定对象执行 相当于 setTarget和invoke

    三 、NSObject类的方法

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector //中进行未定义方法的封装

    - (void)forwardInvocation:(NSInvocation *)anInvocation;//对封装的方法进行调用

    http://blog.csdn.net/bigtiger1648/article/details/51084957

  • 相关阅读:
    BZOJ3171: [Tjoi2013]循环格
    Luogu P1850 换教室(期望dp)
    Luogu P3825 [NOI2017]游戏(2-SAT)
    Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
    Luogu P2272 [ZJOI2007]最大半连通子图(Tarjan+dp)
    Luogu P3209 [HNOI2010]平面图判定(2-SAT)
    Luogu P4171 [JSOI2010]满汉全席(2-SAT)
    Luogu P4782 【模板】2-SAT 问题(2-SAT)
    Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)
    Luogu P4933 大师(dp)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8384903.html
Copyright © 2011-2022 走看看