【iOS Sharing】【2】方法相关
本文最后更新于:2021年12月22日 上午
【iOS笔记】系列目录
目录
1、实例方法去哪里找?
2、类方法去哪里找?
3、分类的方法具体是在什么时候添加到类的方法列表中?
4、class_addMethod()都需要什么参数?
5、函数四要素都是什么?
1、实例方法去哪里找?
答:其所属的类的方法表拓展
问:oc是如何找到需要执行哪个方法的?
答:当需要执行某个实例方法的时候(类方法类似),oc会先去该类的方法的缓存列表里面查找,若找到了,则执行,否则,去该类的方法列表中查找是否存在该方法,存在,执行该方法并更新方法缓存列表,否则,去该父类缓存以及父类方法列表查找,直到根类,若还未找到,则启用动态解析以及消息转发流程,若还是失败,报unrecognized selector异常。
感谢大佬提供的流程图
2、类方法去哪里找?
答:
见1、类方法去哪里找?拓展
3、分类的方法具体是在什么时候添加到类的方法列表中?
答: 类在编译后会以 class_ro_t 的结构把类的信息存储在 bits 里,运行时的 realizeClass 之后,会把 ro 中的所有信息拷贝到 bits 的 data 内,即以 class_rw_t 的形式存在,分类里的方法即在这个时候添加到类的方法表里,并在方法表数组的最前面4、class_addMethod()都需要什么参数?
答:1 |
|
- 给类添加一个新的方法和该方法的具体实现
- BOOL: 返回值,YES ——-方法添加成功 NO ——–方法添加失败
- Class cls: 将要给添加方法的类,传的类型 [类名 class]
- SEL name: 将要添加的方法名,传的类型 @selector(方法名)
- IMP imp:实现这个方法的函数 ,传的类型
- 1、C语言写法:(IMP)方法名
- 2、OC的写法:class_getMethodImplementation(self,@selector(方法名:))
- const char *types:表示我们要添加的方法的返回值和参数
- “v@: @”:
- ‘v’是添加方法无返回值
- ‘@’表示是id(也就是要添加的类)
- ‘:’表示添加的方法类型
- ‘@’表示参数类型
const char *types含义表:
Code | Meaning |
---|---|
c | A char |
i | An int |
s | A short |
l | A long l is treated as a 32-bit quantity on 64-bit programs. |
q | A long long |
C | An unsigned char |
I | An unsigned int |
S | An unsigned short |
L | An unsigned long |
Q | An unsigned long long |
f | A float |
d | A double |
B | A C++ bool or a C99 _Bool |
v | A void |
* | A character string (char *) |
@ | An object (whether statically typed or typed id) |
# | A class object (Class) |
: | A method selector (SEL) |
[array type] | An array |
{name=type…} | A structure |
(name=type…) | A union |
bnum | A bit field of num bits |
^type | A pointer to type |
? | An unknown type (among other things, this code is used for function pointers) |
注意:
用这个方法添加的方法是无法直接调用的,必须用performSelector:调用。
因为performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。
添加方法是在运行时添加的,你在编译的时候还没有这个本类方法,所以当然不行。
5、函数四要素都是什么?
答:函数名,函数参数,参数类型,返回值类型(**PS:ObjC一般叫方法,不叫函数**)联系方式
邮箱: adrenine@163.com
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!