objc 小笔记

小笔记 怕以后忘记 放在这儿下

#Objective-C 中给一个对象发送消息会经过以下几个步骤:

1

/*
 1 在对象类的 dispatch table 中尝试找到该消息。如果找到了,跳到相应的函数IMP去执行实现代码;

 2 如果没有找到,Runtime 会发送(实例方法) +resolveInstanceMethod: 或者(类方法) +resolveClassMethod: 尝试去 resolve 这个消息;

 3 如果 resolve 方法返回 NO,Runtime 就发送(查找一个匹配度很高的类或对象 转发 是否能解决这个问题  其实这里才是真的的转发机制) -forwardingTargetForSelector: 允许你把这个消息转发给另一个对象;

 4 如果没有新的目标对象返回, Runtime 就会发送 /*(转发的目标选择)*/ -methodSignatureForSelector: 和 (异常调用)-forwardInvocation: 消息。你可以发送 (调用异常处理)-invokeWithTarget: 消息来手动转发消息或者发送 -doesNotRecognizeSelector: 抛出异常。
*/
2
 /*
  lookUpImpOrForward  消息转发时调用的方法


  实现的查找 lookUpImpOrForward

  由于实现的查找方法 lookUpImpOrForward 涉及很多函数的调用,所以我们将它分成以下几个部分来分析:

  无锁的缓存查找
  如果类没有实现(isRealized)或者初始化(isInitialized),实现或者初始化类
  加锁
  缓存以及当前类中方法的查找
  尝试查找父类的缓存以及方法列表
  没有找到实现,尝试方法解析器
  进行消息转发
  解锁、返回实现
  无锁的缓存查找

  下面是在没有加锁的时候对缓存进行查找,提高缓存使用的性能:

  runtimeLock.assertUnlocked();

  // Optimistic cache lookup
  if (cache) {
  imp = cache_getImp(cls, sel);
  if (imp) return imp;
  }
  不过因为 _class_lookupMethodAndLoadCache3 传入的 cache = NO,所以这里会直接跳过 if 中代码的执行,在 objc_msgSend 中已经使用汇编代码查找过了。

  */
3

/*
 load 的应用

 1 load 可以说我们在日常开发中可以接触到的调用时间最靠前的方法,在主函数运行之前,load 方法就会调用。

 2 由于它的调用不是惰性的,且其只会在程序调用期间调用一次,最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法调剂的绝佳时机。

 3 但是由于 load 方法的运行时间过早,所以这里可能不是一个理想的环境,因为某些类可能需要在在其它类之前加载,但是这是我们无法保证的。不过在这个时间点,所有的 framework 都已经加载到了运行时中,所以调用 framework 中的方法都是安全的。

 */
 initialize 的应用

 1  initialize 的调用是惰性的,它会在第一次调用当前类的方法时被调用
 2load 不同,initialize 方法调用时,所有的类都已经加载到了内存中
 3  initialize 的运行是线程安全的
 4  子类会继承父类的 initialize 方法
 5  而其作用也非常局限,一般我们只会在 initialize 方法中进行一些常量的初始化


 */
5

//  ----------  关联对象  ObjcAssociation -----
/*
    有这么一个问题:在分类中到底能否实现属性?其实在回答这个问题之前,首先要知道到底属性是什么?而属性的概念决定了这个问题的答案。

    1  如果你把属性理解为通过方法访问的实例变量,我相信这个问题的答案是不能,因为分类不能为类增加额外的实例变量。

    2  不过如果属性只是一个存取方法以及存储值的容器的集合,那么分类是可以实现属性的。

    3  分类中对属性的实现其实只是实现了一个看起来像属性的接口而已。


     关联对象又是如何实现并且管理的呢:

     关联对象其实就是 ObjcAssociation 对象
     关联对象由 AssociationsManager 管理并在 AssociationsHashMap 存储
     对象的指针以及其对应 ObjectAssociationMap 以键值对的形式存储在 AssociationsHashMap 中
     ObjectAssociationMap 则是用于存储关联对象的数据结构
     每一个对象都有一个标记位 has_assoc 指示对象是否含有关联对象

 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值