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"等。不同的字符代表不同的值


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);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容