博客> NSInvocation 高级用法及使用原理详解
NSInvocation 高级用法及使用原理详解
2019-05-22 06:50 评论:0 阅读:476 lvhahaha
ios runtime NSInvocation

首先感谢这两篇文章

NSInvocation用法详解1

NSInvocation用法详解2

Block详解1

借助gitHub地址:

Block 重定义,避开私有API

一、一般方法封装为perSelector

使用NSObject+Invoke下的performSelector方法,进行多参数的逻辑处理 获得如下结果,推荐 arguments传入的是对象,返回也是对象。

 屏幕快照 2019-02-26 下午5.45.52.png

 屏幕快照 2019-02-26 下午5.46.27.png

这个SEL的方法使用没有什么好说的,后边有demo 可以参考。

二、NSInvocation的block用法

SEL与block比较

  • invocation

SEL既有target也有selector,block只有target

  • signature

SEL有两个隐藏参数,类型均为@类型为@和:,分别对应target和selector。block有一个隐藏参数,类型为@?,对应target且block的target为他本身

  • type

以OC对象为例:SEL的type为@,block的type会跟上具体类型,如@"NSString"

但是block也有私有API获得 _Block_signature其实是JavaScriptCore/ObjcRuntimeExtras.h, 这里不再多说。

那么通过Clang的文档,Block定义如下:

 屏幕快照 2019-02-26 下午6.34.20.png

所以CTObjectiveCRuntimeAdditions就通过重新定义block的descriptor,来获取signature。

 屏幕快照 2019-02-26 下午6.06.17.png

既然有了signature,那么NSMethodSignature也不在话下。

 + (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;

在OC中,每一种数据类型可以通过一个字符编码来表示(Objective-C type encodings)。例如字符‘@’代表一个object, 'i'代表int。 那么,由这些字符组成的字符数组就可以表示方法类型了。举个例子:上面提到的printStr1:对应的ObjCTypes 为 v@:@。

’v‘ : void类型,第一个字符代表返回值类型 ’@‘ : 一个id类型的对象,第一个参数类型 ’:‘ : 对应SEL,第二个参数类型 ’@‘ : 一个id类型的对象,第三个参数类型,也就是- (void)printStr1:(NSString*)str中的str。

获得了此NSMethodSignature,当传入block对象的时候,就可以很简单截取block的方法了。

 屏幕快照 2019-02-26 下午6.10.29.png

之后就是其使用方式了。

 屏幕快照 2019-02-26 下午6.28.14.png

demo地址

收藏
2
sina weixin mail 回到顶部