趁着最近比较闲,能够再次研究一下Objective-C的源代码,顺便梳理一下思路,愿有更大收获。app
Objective-C是一门面向对象的程序设计语言。它的对象模型是基于类来创立的。源码能够在苹果开源的runtime中下载,链接是http://opensource.apple.com/tarballs/objc4/ ,本身下载了个objc4-647.tar.gz 版本。函数
看源码能学到不少东西,特别是runtime原理,若是想学好,可是又懒的本身看源码,只是局限于看大神的博客里面的一些他们看完源码以后写的感悟,收获是微乎其微的,至少是只知其一;不知其二,因此,仍是别偷懒,乖乖本身撸一发吧。
spa
先说一点看OC前须要准备的知识:
设计
Class:
指针
能够看到Class实际上是一种指针类型,即用于指向objc_class结构体。NSObject中定义的方法- (Class)class;用于返回其对应的objc_class结构体指针。code
SEL:
对象
typedef struct objc_selector *SEL;字符串
其实它就是个映射到「方法」的C字符串,能够用Objc编译器命令@selector()或者Runtime系统的sel_registerName函数来得到一个SEL类型的「方法选择器」(一般简称「选择子」)。get
考虑到Xcode对@selector的支持比对sel_registerName的支持更好,因此@selector貌似用得更多一些,但有时候sel_registerName或许更简洁一些。编译器
另外,使用@selector()寻找某个方法的时候,若是方法没有实现,编译器会警告,若是使用的是sel_registerName则没有警告。
Method:
typedef struct objc_method *Method;
Ivar:
typedef struct objc_ivar *Ivar;
Category:
typedef struct objc_category *Category;
objc_property_t:
typedef struct objc_property *objc_property_t;
能够经过class_copyPropertyList和protocol_copyPropertyList方法来获取类(Class)和协议(Protocol)中的属性,获取属性以后,还能够使用property_getName获取属性的名字(C字串):这个在一些博客的黑魔法里面也用到了,就是给category增长成员变量。
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount); objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount); const char *property_getName(objc_property_t property);
主要参考博客:http://zhangbuhuai.com/2015/04/26/unstanding-the-Objective-C-Runtime-part1/