UIView和CALayer是啥關(guān)系?CALayer 是 QuartzCore 中的類
1. 首先UIView(繼承UIResponder)可以響應(yīng)事件,Layer(繼承nsobject)不可以.
2. UIView是CALayer的delegate?3. UIView主要處理事件,CALayer負(fù)責(zé)繪制就更好
4. 每個(gè) UIView 內(nèi)部都有一個(gè) CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供。兩者都有樹(shù)狀層級(jí)結(jié)構(gòu),layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個(gè)AnchorPoint
顯式動(dòng)畫(huà)是指用戶自己通過(guò)beginAnimations:context:和commitAnimations創(chuàng)建的動(dòng)畫(huà)。
隱式動(dòng)畫(huà)(4.0后引入)是指通過(guò)UIView的animateWithDuration:animations:方法創(chuàng)建的動(dòng)畫(huà)。
runtime機(jī)制--運(yùn)行時(shí)(xcode5.0以后的)最主要的是消息機(jī)制
1:發(fā)送消息 -本質(zhì)就是讓對(duì)象發(fā)送消息 底層實(shí)現(xiàn)objc_msgSend
?objc_msgSend的執(zhí)行流程可以分為3大階段:
消息發(fā)送 ---
1在調(diào)用方法時(shí)會(huì)先判斷`receiver(消息接收者)是否為空,如果為空則返回,不再往下執(zhí)行;
2?如果不為空就走繼承的那一套機(jī)制,通過(guò)isa去方法緩存(cache_t)的散列表中去查找又沒(méi)有改方法,有就調(diào)用,沒(méi)有就去class_rw_t中的方法列表中去查找,有就調(diào)用。如果不為空就走繼承的那一套機(jī)制,通過(guò)isa去方法緩存(cache_t)的散列表中去查找又沒(méi)有改方法,有就調(diào)用,沒(méi)有就去class_rw_t中的方法列表中去查找,有就調(diào)用。
3如果本類的方法列表沒(méi)有就通過(guò)superclass去父類的方法緩存和方法列表去查找,有就調(diào)用;
4:如果指定基類都找不到該方法就會(huì)開(kāi)始動(dòng)態(tài)的方法解析。
注意:上面在class_rw_t中查找方法,已經(jīng)排序的,二分查找;沒(méi)有排序的,遍歷查找。
動(dòng)態(tài)方法解析
1:先判斷是否是原類,如果不是就會(huì)調(diào)用+(BOOL)resolveInstanceMethod:(SEL)sel方法解析實(shí)例對(duì)象方法,如果是就調(diào)用+ (BOOL)resolveClassMethod:(SEL)sel來(lái)動(dòng)態(tài)解析類方法。
2:調(diào)用上面兩個(gè) 方法后標(biāo)記為已經(jīng)動(dòng)態(tài)解析了,然后將方法相關(guān)信息添加到方法列表中,然后再調(diào)用objc_msgSend即消息發(fā)送的那一套繼承等機(jī)制。
3:如果動(dòng)態(tài)解析后還沒(méi)找到該方法實(shí)現(xiàn)就來(lái)到消息轉(zhuǎn)發(fā)。
消息轉(zhuǎn)發(fā)
1首先會(huì)調(diào)用(id)forwardingTargetForSelector:(SEL)aSelector方法(目的是將該方法轉(zhuǎn)發(fā)給對(duì)應(yīng)targget,就是調(diào)用對(duì)應(yīng)targget對(duì)應(yīng)的同名方法),這時(shí)候如果返回的是一個(gè)類或者實(shí)例對(duì)象,就會(huì)調(diào)用該類或者實(shí)例對(duì)象同名的方法(直接用該對(duì)象或類調(diào)用其對(duì)應(yīng)的方法);
---------------------
2:交換方法?class_getClassMethod -》method_exchangeImplementations
3:動(dòng)態(tài)添加方法resolveClassMethod--class_addMethod
4:給分類添加關(guān)聯(lián)屬性objc_getAssociatedObject--》objc_setAssociatedObject-objc_removeAssociatedObjects
kvo原理?實(shí)際上是創(chuàng)建了一個(gè) NSKVONotifying_XXX的子類,然后用runtime的isa-swizzling技術(shù)實(shí)現(xiàn)。
首先會(huì)調(diào)用(id)forwardingTargetForSelector:(SEL)aSelector方法(目的是將該方法轉(zhuǎn)發(fā)給對(duì)應(yīng)targget,就是調(diào)用對(duì)應(yīng)targget對(duì)應(yīng)的同名方法),這時(shí)候如果返回的是一個(gè)類或者實(shí)例對(duì)象,就會(huì)調(diào)用該類或者實(shí)例對(duì)象同名的方法(直接用該對(duì)象或類調(diào)用其對(duì)應(yīng)的方法);
---------------------
---------------------