objc 小笔记

来源:互联网 发布:网络机顶盒直播软件下载 编辑:程序博客网 时间:2024/06/11 11:14

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

#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 指示对象是否含有关联对象 */
0 0