Objective-C 源码(零):前戏

本文旨在通过Objective-C的源码学习,重点介绍了Class、SEL、Method等关键概念,并提供了实际示例。通过理解这些基本组件,读者能够深入掌握Objective-C的面向对象编程原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/caijunrong/blog/528569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值