BlocksKit A2DynamicDelegate研究

NSInvocation

NSInvocation本质就是将一个方法转发成一个对象。NSInvocation中的selector 直接关联着一个方法

@interface NSInvocation:NSObject

通过方法签名获得NSInvocation对象

  • (NSInvocation)invocationWithMethodSignation:(NSMethodSignature)sig;

    readonly的方法签名对象。只可以在实例化对象的时候传入,之后只能读取不可以修改

    @property (readonly, retain) NSMethodSignature *methodSignature;

    //可以设置的调用对象
    @property(nullable,assign) id target;

    // 调用方法

    @property SEL selector;

    //调用

    -(void)invoke;

    //让某个对象去相应

-(void)invokeWithTarget:(id)target;

NSMethodSignature(方法签名)

主要方法是 (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;

通过一个Type Encoding 来实例化一个方法签名的实例对象。

Type Encoding一般格式为"v@:","v@:@","v@:i"等。不同的字符代表不同的值


BlocksKit A2DynamicDelegate研究_第1张图片
Snip20170923_38.png

runtime的一些APi

  • Class object_getClass

  • struct objc_method_description protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel, BOOL isRequiredMethod, BOOL isInstanceMethod) 获取协议中某个方法的声明。获得是一个结构体对象。 objc_method_description 中包含一个SEL对象,和一个const char* type对象

  • protocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other) 比较两个协议是否相同

  • sel_isEqual(SEL _Nonnull lhs, SEL _Nonnull rhs)
    比较2个Selector是否相同

  • obj_getProtcol(const char*) 通过一个字符串得到一个Protocol

  • 得到一个类实例的父类 class_getSuperClass(Class class);

你可能感兴趣的:(BlocksKit A2DynamicDelegate研究)