UIView和CALayer是啥关系?CALayer 是 QuartzCore 中的类
1. 首先UIView(继承UIResponder)可以响应事件,Layer(继承nsobject)不可以.
2. UIView是CALayer的delegate 3. UIView主要处理事件,CALayer负责绘制就更好
4. 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
显式动画是指用户自己通过beginAnimations:context:和commitAnimations创建的动画。
隐式动画(4.0后引入)是指通过UIView的animateWithDuration:animations:方法创建的动画。
runtime机制--运行时(xcode5.0以后的)最主要的是消息机制
1:发送消息 -本质就是让对象发送消息 底层实现objc_msgSend
objc_msgSend的执行流程可以分为3大阶段:
消息发送 ---
1在调用方法时会先判断`receiver(消息接收者)是否为空,如果为空则返回,不再往下执行;
2 如果不为空就走继承的那一套机制,通过isa去方法缓存(cache_t)的散列表中去查找又没有改方法,有就调用,没有就去class_rw_t中的方法列表中去查找,有就调用。如果不为空就走继承的那一套机制,通过isa去方法缓存(cache_t)的散列表中去查找又没有改方法,有就调用,没有就去class_rw_t中的方法列表中去查找,有就调用。
3如果本类的方法列表没有就通过superclass去父类的方法缓存和方法列表去查找,有就调用;
4:如果指定基类都找不到该方法就会开始动态的方法解析。
注意:上面在class_rw_t中查找方法,已经排序的,二分查找;没有排序的,遍历查找。
动态方法解析
1:先判断是否是原类,如果不是就会调用+(BOOL)resolveInstanceMethod:(SEL)sel方法解析实例对象方法,如果是就调用+ (BOOL)resolveClassMethod:(SEL)sel来动态解析类方法。
2:调用上面两个 方法后标记为已经动态解析了,然后将方法相关信息添加到方法列表中,然后再调用objc_msgSend即消息发送的那一套继承等机制。
3:如果动态解析后还没找到该方法实现就来到消息转发。
消息转发
1首先会调用(id)forwardingTargetForSelector:(SEL)aSelector方法(目的是将该方法转发给对应targget,就是调用对应targget对应的同名方法),这时候如果返回的是一个类或者实例对象,就会调用该类或者实例对象同名的方法(直接用该对象或类调用其对应的方法);
---------------------
2:交换方法 class_getClassMethod -》method_exchangeImplementations
3:动态添加方法resolveClassMethod--class_addMethod
4:给分类添加关联属性objc_getAssociatedObject--》objc_setAssociatedObject-objc_removeAssociatedObjects
kvo原理 实际上是创建了一个 NSKVONotifying_XXX的子类,然后用runtime的isa-swizzling技术实现。
首先会调用(id)forwardingTargetForSelector:(SEL)aSelector方法(目的是将该方法转发给对应targget,就是调用对应targget对应的同名方法),这时候如果返回的是一个类或者实例对象,就会调用该类或者实例对象同名的方法(直接用该对象或类调用其对应的方法);
---------------------
---------------------