日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Objective-C】Objective-C語(yǔ)言的動(dòng)態(tài)性

 新進(jìn)小設(shè)計(jì) 2022-01-11

  Objective-C語(yǔ)言的動(dòng)態(tài)性主要體現(xiàn)在以下3個(gè)方面

 ?。?)動(dòng)態(tài)類型:運(yùn)行時(shí)確定對(duì)象的類型。

 ?。?)動(dòng)態(tài)綁定:運(yùn)行時(shí)確定對(duì)象的方法。

 ?。?)動(dòng)態(tài)加載:運(yùn)行時(shí)加載需要的資源或者或代碼模塊。

一、動(dòng)態(tài)類型

  動(dòng)態(tài)類型指對(duì)象指針類型的動(dòng)態(tài)性,具體地說(shuō)就是使用id類型將對(duì)象的類型推遲到運(yùn)行時(shí)才確定,由賦給它的對(duì)象類型決定該對(duì)象類型(說(shuō)起來(lái)怎么這么繞口),也就是說(shuō)id修飾的對(duì)象是動(dòng)態(tài)類型對(duì)象,其他在編譯期指明類型的為靜態(tài)類型對(duì)象,所以開(kāi)發(fā)中如果不是涉及到多態(tài),盡量還是使用靜態(tài)的類型,這樣編寫(xiě)錯(cuò)誤,編譯器會(huì)提前查出問(wèn)題,可讀性更高一點(diǎn)。

    //編譯時(shí)認(rèn)為是NSString,這是賦值了一個(gè)NSData對(duì)象編譯器會(huì)給出警告信息:Incompatible pointer types initializing 'NSString *' with an expression of type 'NSData *'
    NSString *testObject = [[NSData alloc]init];
    //編譯其認(rèn)為是NSString,所以允許使用NSString的方法,不會(huì)有警告和錯(cuò)誤,
    [testObject stringByAppendingString:@"string"];
    //編譯期不允許使用NSData的方法,錯(cuò)誤提示;No visible @interface for 'NSString' declares the selector 'base64EncodedDataWithOptions:'
    [testObject  base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];

  如以上代碼,testObject在編譯時(shí),指針的類型是NSString,也就是說(shuō)編譯時(shí)期是被當(dāng)做一個(gè)NSString類型來(lái)處理,編譯器在類型檢查時(shí)發(fā)現(xiàn)類型不匹配會(huì)給出警告信息,testObject在運(yùn)行時(shí),指針指向的是一個(gè)NSData對(duì)象,因此如果指針調(diào)用了NSString的方法,那么雖然編譯通過(guò)了,但運(yùn)行時(shí)會(huì)出現(xiàn)崩潰,

二、動(dòng)態(tài)綁定

  動(dòng)態(tài)綁定是建立在動(dòng)態(tài)類型的基礎(chǔ)之上,在OC的消息分發(fā)機(jī)制下將要執(zhí)行的方法推遲到運(yùn)行時(shí)才確定,可以動(dòng)態(tài)的添加方法。也就是說(shuō)一個(gè)OC對(duì)象是否調(diào)用某個(gè)方法不是在編譯器確定的,方法的調(diào)用不和代碼綁定在一起,而是到了運(yùn)行時(shí)根據(jù)發(fā)出的具體消息,才去動(dòng)態(tài)的確定需要調(diào)用的代碼。

三、動(dòng)態(tài)加載

  動(dòng)態(tài)加載分為兩部分:動(dòng)態(tài)資源的加載(如:圖片資源),代碼模塊的加載;這些都是在運(yùn)行時(shí)根據(jù)需要有選擇性的添加到程序中的,是一種代碼和資源的“懶加載”模式,這樣降低編譯時(shí)期對(duì)內(nèi)存的開(kāi)銷,提供程序的性能。

  如:資源在動(dòng)態(tài)加載圖片進(jìn)行屏幕適配時(shí),因?yàn)橥粋€(gè)圖片對(duì)象可能會(huì)準(zhǔn)備幾種不同分辨率的圖片資源,程序就會(huì)根據(jù)當(dāng)前機(jī)型動(dòng)態(tài)的選擇對(duì)應(yīng)分辨率的圖片,如:@1x,@2x,@3x的。

四、消息傳遞機(jī)制

  在OC中,方法的調(diào)用不能再去理解為對(duì)象調(diào)用其方法,而是要理解成對(duì)象接收消息。消息的發(fā)送采用“動(dòng)態(tài)綁定”的機(jī)制,具體會(huì)調(diào)用那個(gè)方法直到運(yùn)行時(shí)才確定。方法的調(diào)用其實(shí)就是告訴對(duì)象要做些什么事,給對(duì)象發(fā)送一個(gè)消息,對(duì)象為就是接收者recevier,調(diào)用的方法及其參數(shù)就是消息message,如果要給一個(gè)對(duì)象傳遞消息,可以表示為:[receiver message:xxx]。

  在消息傳遞機(jī)制中,當(dāng)開(kāi)發(fā)者編寫(xiě)[receiver message:xxx]語(yǔ)句進(jìn)行發(fā)送消息后,編譯器都會(huì)將其轉(zhuǎn)換成objc_msgSend C語(yǔ)言的發(fā)送格式。格式為:

void objc_msgSend(id self, SEL sel ...);

  這個(gè)函數(shù)參數(shù)可變,第一個(gè)參數(shù)填入消息的接收者,第二個(gè)參數(shù)傳入的是消息,后面可以跟一下可選的消息參數(shù)。有了這些參數(shù),objc_msgSend就能根據(jù)接收者的isa指針,到其對(duì)象的方法列表中以sel 的名稱尋找對(duì)應(yīng)的方法。若找到對(duì)應(yīng)的方法,就會(huì)轉(zhuǎn)到它的實(shí)現(xiàn)代碼執(zhí)行,如果找不到,就去父類中尋找,如果找到了根類還是無(wú)法找到對(duì)應(yīng)的方法,說(shuō)明接收者對(duì)象無(wú)法響應(yīng)該消息,那么就會(huì)觸發(fā)消息轉(zhuǎn)發(fā)機(jī)制,給開(kāi)發(fā)者一次補(bǔ)救程序的機(jī)會(huì)。

五、消息轉(zhuǎn)發(fā)機(jī)制

  如果在消息傳遞過(guò)程中,接收者無(wú)法響應(yīng)收到的消息,那么就會(huì)觸發(fā)到消息轉(zhuǎn)發(fā)機(jī)制。

  消息轉(zhuǎn)發(fā)提供了3道防線,任何一個(gè)起了作用,都能補(bǔ)救此次消息轉(zhuǎn)發(fā)。依次為:

  (1)動(dòng)態(tài)的補(bǔ)加方法的實(shí)現(xiàn)

+(BOOL)resolveClassMethod:(SEL)sel
+(BOOL)resolveInstanceMethod:(SEL)

 ?。?)直接返回消息到轉(zhuǎn)發(fā)到的對(duì)象(就是將消息發(fā)送到另一個(gè)對(duì)象去處理)

-(id)forwardingTargetForSelector:(SEL)aSelector

 ?。?)手動(dòng)生成簽名并轉(zhuǎn)發(fā)給另外一個(gè)對(duì)象

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
-(void)forwardInvocation:(NSInvocation *)anInvocation

六、OC的編譯時(shí)和運(yùn)行時(shí)都做了哪些工作?

  編譯時(shí):該階段,編譯器對(duì)語(yǔ)言進(jìn)行編譯,編譯器只會(huì)對(duì)語(yǔ)言進(jìn)行最基本的檢查報(bào)錯(cuò)、語(yǔ)法分析等,并將程序代碼翻譯成計(jì)算機(jī)能夠識(shí)別的語(yǔ)言。那編譯通過(guò)了,是不是就可以成功執(zhí)行呢?你太單純了,想的美。

  運(yùn)行時(shí):程序通過(guò)了編譯之后,就會(huì)將編譯好的代碼轉(zhuǎn)載到內(nèi)存中,這時(shí)候就會(huì)對(duì)類型進(jìn)行檢查,不僅僅是簡(jiǎn)單的掃描分析,此時(shí)若出現(xiàn)問(wèn)題,程序可就Game Over了。

  編譯時(shí)就是一個(gè)靜態(tài)的階段,類型明顯錯(cuò)誤,就會(huì)被直接檢查出來(lái),運(yùn)行時(shí)時(shí)動(dòng)態(tài)的階段,會(huì)將程序與開(kāi)發(fā)環(huán)境結(jié)合起來(lái)。

 

  OC是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言,主要指的是OC語(yǔ)言的動(dòng)態(tài)性。

  動(dòng)態(tài)性即OC的動(dòng)態(tài)類型、動(dòng)態(tài)綁定、動(dòng)態(tài)加載,將對(duì)象類型的確定、方法調(diào)用的確定、代碼和資源的轉(zhuǎn)載推遲到運(yùn)行時(shí)記性,靈活方便。

   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多