趁着最近比较闲,可以再次研究一下Objective-C的源代码,顺便梳理一下思路,愿有更大收获。
Objective-C是一门面向对象的程序设计语言。它的对象模型是基于类来创立的。源码可以在苹果开源的runtime中下载,连接是http://opensource.apple.com/tarballs/objc4/ ,自己下载了个objc4-647.tar.gz 版本。
看源码能学到很多东西,特别是runtime原理,如果想学好,但是又懒的自己看源码,只是局限于看大神的博客里面的一些他们看完源码之后写的感悟,收获是微乎其微的,至少是一知半解,所以,还是别偷懒,乖乖自己撸一发吧。
先说一点看OC前需要准备的知识:
Class:
可以看到Class其实是一种指针类型,即用于指向objc_class结构体。NSObject中定义的方法- (Class)class;用于返回其对应的objc_class结构体指针。
SEL:
typedef struct objc_selector *SEL;
其实它就是个映射到「方法」的C字符串,可以用Objc编译器命令@selector()或者Runtime系统的sel_registerName函数来获得一个SEL类型的「方法选择器」(通常简称「选择子」)。
考虑到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/