学习ios的同学都知道ojbc一种runtime的语言,runtime表明函数的真正执行的时候来确定函数执行的。这样的好处就是我们能很灵活的设计我们的代码,也能在看似合法的情况下做一些非常有意思的事情,要了解ios的runtime,我们需要了解ios的类结构,ios所有的类的基类都是NSObject这个类,从这个类来分析ios的runtime机制。

下面我们在xcode 中打开 NSObject 的声明,为了简单明了,我省略了很多,类型和宏的声明。
NS_ROOT_CLASS
@interface NSObject <NSObject> {Class    isa;
}+ (void)load;+ (void)initialize;
- (id)init;+ (id)new;
+ (id)allocWithZone:(NSZone *)zone;
+ (id)alloc;
- (void)dealloc;- (void)finalize;- (id)copy;
- (id)mutableCopy;+ (id)copyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
+ (id)mutableCopyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;+ (Class)superclass;
+ (Class)class;
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
+ (BOOL)conformsToProtocol:(Protocol *)protocol;
- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
- (void)doesNotRecognizeSelector:(SEL)aSelector;- (id)forwardingTargetForSelector:(SEL)aSelector NS_AVAILABLE(10_5, 2_0);
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;- (BOOL)allowsWeakReference NS_UNAVAILABLE;
- (BOOL)retainWeakReference NS_UNAVAILABLE;+ (NSString *)description;+ (BOOL)isSubclassOfClass:(Class)aClass;+ (BOOL)resolveClassMethod:(SEL)sel NS_AVAILABLE(10_5, 2_0);
+ (BOOL)resolveInstanceMethod:(SEL)sel NS_AVAILABLE(10_5, 2_0);@end

如您所见,NSObject的对象非常之简单,Class 类型的,我们再看Class 是什么:
#include <sys/types.h>      // for __DARWIN_NULL
#include <Availability.h>
#include <objc/objc-api.h>typedef struct objc_class *Class;
typedef struct objc_object {Class isa;
} *id;

ok,Class是一个 objc_class 的结构体的指针,现在我们只要了解objc_class的结构就好了。
typedef struct objc_method *Method;
typedef struct objc_ivar *Ivar;
typedef struct objc_category *Category;
typedef struct objc_property *objc_property_t;struct objc_class {Class isa;#if !__OBJC2__Class super_class                                        OBJC2_UNAVAILABLE;const char *name                                         OBJC2_UNAVAILABLE;long version                                             OBJC2_UNAVAILABLE;long info                                                OBJC2_UNAVAILABLE;long instance_size                                       OBJC2_UNAVAILABLE;struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;struct objc_cache *cache                                 OBJC2_UNAVAILABLE;struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif} OBJC2_UNAVAILABLE;

现在明了了,super_class是其父类的指针,name是类名,version,info,instance_size是表明这个类的信息, ivars是这个类的变量列表,methodLists是函数列表,cache,是一个方法的list的cache,protocols当然是一个protocol的list。

好了,我们对NSobject 类有了基本的了解了,

[aObjec performSelector:aSEL]; 当这行代码执行的时候,aObject 首先会去找cache,里头有没有对应函数,如果找不到,会去找methodLists 列表中是否含有对应的函数,如果再没有就会去找 super_class 中的cache,然后..... 继续这样的步骤.......

所以我们现在了解了NSObject 对于消息的发送的基本的机制流程,后续我会介绍NSOject 我们在这个机制上能做的一些事情。

[置顶] 浅析objc的消息机制相关推荐

  1. 微信支持群消息置顶;博通洽购虚拟机巨头VMware;

    微信支持群消息置顶 近日,微信iOS版更新了8.0.22版本,有用户发现,在该版本中,#微信新增群消息置顶功能#.群主或管理员长按需要置顶的消息,在菜单中点击置顶操作.之后消息就会置于群聊天界面的顶部 ...

  2. Windows 消息机制浅析

    Windows 消息机制浅析 1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以, ...

  3. 推荐+1置顶+1(分享、讨论、实现)通用软件注册功能之建立有效的软件保护机制...

    推荐+1置顶+1(分享.讨论.实现) 通用软件注册功能之建立有效的软件保护机制 众所周知,一些共享软件往往提供给使用者的是一个功能不受限制的限时使用版,在试用期内使用者可以无限制的使用软件的全部功能( ...

  4. 推荐+1置顶+1(分享、讨论、实现) 通用软件注册功能之建立有效的软件保护机制

    推荐+1置顶+1(分享.讨论.实现) 通用软件注册功能之建立有效的软件保护机制 众所周知,一些共享软件往往提供给使用者的是一个功能不受限制的限时使用版,在试用期内使用者可以无限制的使用软件的全部功能( ...

  5. autojs模仿qq消息列表侧拉置顶删除菜单

    牙叔教程 简单易懂 效果展示 思路 使用安卓qq可知, 消息列表每次只能有一个侧拉菜单被打开 autojs版本 9.0.4 你将学到以下知识点 RecyclerView的基本使用 拦截rv的触摸事件 ...

  6. 金山卫士开源代码----消息机制浅析 (上

    博客已迁移至:http://kulv.sinaapp.com/,这里不再使用 金山卫士开源代码----消息机制浅析 (上) 代码地址:http://download.csdn.net/source/3 ...

  7. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: [java] view plaincopy public class MainActivity extends Activity impleme ...

  8. 从一个置顶CPT广告学习计算广告设计要点

    Outlook > Knowledge > IQ 达芬奇有很高的 IQ,在他的时代构想了很多发明,却不能够实现自己的发明 亨利·福特出生在合适的年代,在福特的时代,他拥有足够知识,得以制造 ...

  9. 项目1在线交流平台-7.构建安全高效的企业服务-3. Security整合Kafka,ES,Thymeleaf实例-对帖子置顶、加精、删除

    文章目录 功能需求 一.置顶.加精.删除帖子功能的实现 1. dao层处理数据 接口定义 sal语句定义 2. service层业务处理 3. Controller层处理按钮事件异步请求 异步请求及k ...

最新文章

  1. vue 组件以字符串插入_今日分享:vue3多层嵌套组件如何访问到最外层组件的数据?...
  2. ObjectInputStreamObjectOutputStream工具类
  3. java hascode
  4. 云原生存储详解:容器存储与 K8s 存储卷
  5. 使用tensorflow查询机器上是否存在可用的gpu设备
  6. 任何抛开业务谈大数据量的sql优化都是瞎扯
  7. 线性代数知识汇总(转载)
  8. python类的使用_python类的使用
  9. PostgreSQL SSL启用与CA证书生成、配置
  10. CommonLibrary——框架通用工具库
  11. Unity实现3D物体叠加到摄像头画面上
  12. [渝粤教育] 广东-国家-开放大学 21秋期末考试物权法10774k1
  13. PS-elevenday-铅笔工具(颜色替换)
  14. Python爬虫从入门到精通:(14)验证码识别_Python涛哥
  15. 尝试docker1.12内置swarm
  16. 卫星影像去雾与色彩复原
  17. 京东一元抢宝系统的数据库架构优化
  18. qq公众号消息是发送到自己服务器,qq公众号屏蔽后还发消息 qq消息被屏蔽了怎么办...
  19. 航班信息的查询与检索Java,航班信息的查询与检索
  20. 世界名模刘金金称赞续元金方是国宝,表示:振兴国医,义不容辞

热门文章

  1. 并发编程之——读锁源码分析(解释关于锁降级的争议)
  2. jdk历史各个版本下载
  3. Android下对Cookie的读写操作(附Demo)
  4. 局域网共享的解决方法
  5. 比特币现金的第四次战役
  6. spring框架四大原则
  7. 通用权限管理系统组件 (GPM - General Permissions Manager)
  8. 大数据安全“脆弱性”凸显 防护成重要课题
  9. USB学习笔记连载(八):FX2替换到FX2LP需要注意事项
  10. Object-C 如何把一个时间戳转换为一个标准的时间格式?