Objective-C 源码(零):前戏

    趁着最近比较闲,能够再次研究一下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/ 

相关文章
相关标签/搜索