前言:学习iOS至今已经一年多了,包括实习也有了一年的时间了,这一年的工作里,用得比较多的还是界面逻辑,空间,动画等以及一些数据操作等。偶尔也犯犯嘀咕,最繁琐的逻辑问题,比如说排序啦,筛选啦、搜索啦这些涉及到效率复杂度的东西已经在后台进行处理过了,服务端返回给你的数据就大致已经是你需要的那堆数据了。接触多了这些东西,感觉好像app前端开发的东西有点...无脑?2333其实也不能这么说,不过至少最需要智商的算法我很少用得到。学习iOS也已经快一年了,扪心自问下自己目前的水平是否就是一年经验的水平了。所以说,惭愧之下,开始接触更底层的东西,比如说消息机制、Runtime等等这些一直不敢去涉及的东西(这话题转回来的...就问你服不服!233)
接下来要写的东西,都是杂七杂八的东西随笔记,能看则看。等到记的东西多了,就整理下,写成一篇系列文。因为简书不支持文章内部跳转,所以名词解释就单单放了一章。
目录
- 前言
- 名词解释
- OC消息传递和转发机制
- Runtime
- 自己动手写一个框架
- Method Swizzling黑魔法
- Category实现原理
- 反射机制
- Runloop
- ...
感觉。。挖了好大一个坑。。。
名词解析:
源码皆来自runtime.h
- Ivar
struct objc_ivar {
char *ivar_name; //实例变量名
char *ivar_type; //实例变量类型类型
int ivar_offset; //基地址偏移字节
int space;
}
typedef struct objc_ivar *Ivar;
Ivar是用来定义对象的实例变量。Ivar是objc_ivar结构体,从结构体看出,Ivar包括类型和名字等。
这里有人会奇怪,Ivar (实例) 和 Property (属性) 有什么区别?我个人的想法是Ivar 和 Property主要差别在于property包括了Ivar的属性以外,还封装了setter( ) 和 getter( ) 方法。还有更底层的现在就不去了解了,比如objc_property等
- id
typedef struct objc_object {
Class isa;
} *id;
id用来表示任何一个对象,从结构体看出,id其实是一个objc_object结构的指针,其isa指针指向了Class成员。
- isa
isa指针是一个Class类型的指针,每个实例对象都有对应isa指针。其实Class也有个isa指针,指向了meteClass元类,元类也有个isa指针指向root meteClass根元,根元的isa指针指向自己。如此,就可以找到静态方法和变量了。 - SEL
typedef struct objc_selector *SEL;
SEL其实也是其中一种数据类型,用来定义类方法,是类成员方法的指针,本质上其实只是一串字符串。(其实可以看做是类方法的identifier)
//定义:
SEL aSelector = @selector(SEL selector);
SEL bSelector = NSSelectorFromString(NSString *aSelectorName);
*用通过runtime的sel_registerName方法也可以获取,未尝试.
//获取方法名字字符串
NSString *methodsName = NSStringFromSelector(SEL aSelector);
- IMP
typedef id (*IMP)(id, SEL, ...); //有返回值
typedef void (*_VIMP) (id,SEL,...); //无返回值
IMP(Implementation)是一个指向具体实现的方法的地址指针,参数都包含id和SEL类型。通过id(实例对象)里的SEL(方法指针)获取到唯一的实现方法,当然,IMP还有更底层更广泛的应用
其实,直接调用方法的IMP指针效率比调用方法本身更高。但是也不要盲目得去用IMP来提高速率,毕竟可读性肯定没有那么高了。
- Method
struct objc_method {
SEL method_name; //方法名
char *method_types; //参数以及返回类型
IMP method_imp; //指向具体方法实现的指针
}
typedef struct objc_method *Method;
Method就是函数方法,从源码可知,是一个objc_method的结构体,结构体包括一个SEL属性的方法名(可以看做是这个方法的identifier,可以通过这个属性来获取到该方法),一个method_types指的是参数以及返回类型的描述字符串,(*后者是博文Objective-C method及相关方法分析看到的,有待深入研究),第三个参数就是指向具体实现方法的IMP指针method_imp。通过这三个成员变量,就可以实现方法了。
- Class
typedef struct objc_class *Class;
.
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
#endif
};
网友评论