iOS相關(guān)題目-OC對(duì)象本質(zhì)是一個(gè)結(jié)構(gòu)體

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)的方法);

---------------------

---------------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,683評(píng)論 1 32
  • 面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài) OC內(nèi)存管理 _strong 引用計(jì)數(shù)器來(lái)控制對(duì)象的生命周期。 _weak...
    運(yùn)氣不夠技術(shù)湊閱讀 1,230評(píng)論 0 10
  • 重點(diǎn)參考鏈接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi閱讀 4,721評(píng)論 0 15
  • 【大楚】的情書(shū) 老師給我發(fā)來(lái)了你在幼兒園的繪畫(huà)作品。 我一看就樂(lè)了,怎么這么可愛(ài)~ 爸爸媽媽的繪畫(huà)水準(zhǔn)只能用“慘不...
    浮沉浮沉閱讀 180評(píng)論 0 0
  • 新鮮的山楂洗凈 去核去花去蒂將等量的清水一起放進(jìn)鍋里,吃得甜多放點(diǎn)冰糖,不怕酸就少放點(diǎn)。 大火燒開(kāi),轉(zhuǎn)小火,冰糖化...
    祺爺閱讀 254評(píng)論 0 0

友情鏈接更多精彩內(nèi)容