写在前面


博客迁移好多回,数据备份好多遍,索性不再折腾了。

目前用UlyssesMedium配合起来工作,实际证明Medium排版太难用。

iOS开发有些年头了,除了一些私人库,一直没写点像样的总结。

赶在swift3.0 发布之前,看看objc源码,做个小结,也算对自己做个交代。

阅读内容如下,后面会做适当调整。

  • objective-c 源码
  • runtime 源码
  • foundation 框架源码
  • swift 3.0 源码

objective-c 源码环境配置

git下载源码 更新版 官方版

两个版本源码库,都基于objc 680版本,前者在官方版的基础上,修复了一些编译问题,加入了调试target。同时与官方版的项目结构同步,后期逐步完善源码注释。

#更新版本
git clone git@github.com:phnessu4/objc-runtime.git
#官方版本
git clone git@github.com:opensource-apple/objc4.git

项目clone成功后。直接运行objc.xcodeproj即可。

使用clang rewrite objective-c代码

阅读源码,可以加深了解底层实现设计,如果看oc代码不能满足你的好奇心。这时可以用clang将oc代码转换为c++实现,让你着手于更深层次。

# 正常转换
clang -rewrite-objc class.m

# 个别系统sdk指定,waring屏蔽等等。复杂使用请参考clang手册。
clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk class.m

clang -Wall -pedantic -Wextra -rewrite-objc -c class.m

举例class.m

#include <objc/NSObject.h>
@interface OCObject : NSObject @end
@implementation OCObject @end

需要注意,虽然class.m 只有一个类定义,但转换后代码量确不少,系统定义占据了大半部分。

转换结果详见 git gist

补充阅读:objective-c中的block的c语言实现及 clang rewrite


If it ain't raining, it ain't training!