日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Objective-C语言的动态性

發(fā)布時(shí)間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-C语言的动态性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Objective-C具有相當(dāng)多的動(dòng)態(tài)特性,基本的,也是經(jīng)常被提到和用到的有動(dòng)態(tài)類型(Dynamic typing),動(dòng)態(tài)綁定(Dynamic binding)和動(dòng)態(tài)加載(Dynamic loading)

一、編譯時(shí)和運(yùn)行時(shí)

編譯時(shí):即編譯器對(duì)語(yǔ)言的編譯階段,編譯時(shí)只是對(duì)語(yǔ)言進(jìn)行最基本的檢查和報(bào)錯(cuò)。包括語(yǔ)法分析、詞法分析等等,將程序代碼返程成計(jì)算機(jī)能識(shí)別的語(yǔ)言(例如匯編),編譯通過(guò)并不意味著程序就可以成功運(yùn)行。

運(yùn)行時(shí):即程序通過(guò)編譯這一關(guān)后,編譯好的代碼被裝在到內(nèi)存中這個(gè)階段,這個(gè)時(shí)候會(huì)對(duì)具體內(nèi)存進(jìn)行檢查,而不僅僅對(duì)代碼的簡(jiǎn)單掃描分析,此時(shí)若出錯(cuò)誤程序會(huì)崩潰。

可以說(shuō)編譯是一個(gè)靜態(tài)的階段,類型錯(cuò)誤很明顯可以直接檢查出來(lái),可讀性好,而運(yùn)行時(shí)則是動(dòng)態(tài)的階段,尅是具體與運(yùn)行環(huán)境結(jié)合起來(lái)。

二、oc語(yǔ)言的動(dòng)態(tài)性

? 含義:oc語(yǔ)言的動(dòng)態(tài)性主要體現(xiàn)在三個(gè)方面:動(dòng)態(tài)類型(Dynamic typing)、動(dòng)態(tài)綁定和動(dòng)態(tài)加載。

? 1.動(dòng)態(tài)類型

? 動(dòng)態(tài)類型是指隊(duì)形指針類型的動(dòng)態(tài)性,具體是指使用id任意類型將對(duì)象的類型確定推遲到運(yùn)行時(shí),由賦給他的對(duì)象類型決定對(duì)象指針的類型,另外類型確定推遲到運(yùn)行時(shí)之后,可以通過(guò)nsobject的isKindofClass方法動(dòng)態(tài)判斷對(duì)象的最后的類型,(動(dòng)態(tài)類型的識(shí)別)也就是說(shuō)id修飾的對(duì)象為動(dòng)態(tài)類型的對(duì)象,其他在編譯器指明類型的為靜態(tài)類型對(duì)象,通常如果不需要涉及到多態(tài)的話還是要盡量使用靜態(tài)類型(原因上面已經(jīng)說(shuō)到:錯(cuò)誤可以在編譯器體檢檢查出來(lái),可讀性好)

示例:

// 編譯的時(shí)候人為obj是一個(gè)nsstring對(duì)象NSString* obj = [[NSData alloc]init];// 編譯通過(guò),運(yùn)行的時(shí)候直接崩潰[obj stringByAppendingString:@"string"];

  通過(guò)這里就可以知道,將類型的確定延遲到運(yùn)行時(shí),體現(xiàn)了oc語(yǔ)言的一種動(dòng)態(tài)性:動(dòng)態(tài)類型。

動(dòng)態(tài)類型的識(shí)別方法

(1)首先是Class類型

? ? Class class = [NSObject class]; // 通過(guò)類名得到對(duì)應(yīng)的Class動(dòng)態(tài)類型

? ? Class class = [obj class];? ? ? ? ?// 通過(guò)實(shí)例對(duì)象得到對(duì)應(yīng)的Class動(dòng)態(tài)類型

? ? if([obj1 class] == [obj2 class])? // 判斷是不是相同類型的實(shí)例

(2)Class動(dòng)態(tài)類型和類名字符串的相互轉(zhuǎn)換

? ? NSClassFromString(@"NSObject");

? ? NSStringFromClass([NSObject class]);

? ? NSStringFromClass([obj class]);

? (3) 判斷對(duì)象是否屬于某種動(dòng)態(tài)類型:

? ?- (BOOL)isKindOfClass:class

? ?- (BOOL)? isMemberOfClass:obj?

? (4)判斷類中是否有對(duì)應(yīng)的方法:

? - (BOOL)respondsToSelector:(SEL)selector? // 類中是否有這個(gè)類方法

?- (BOOL)instancesResponsdToSelector:(SEL)selector // 判斷對(duì)象中是否有這個(gè)實(shí)例方法

? (5)方法名字符串和SEL類型的轉(zhuǎn)換

? ? SEL funcID = @select(func);

? ? SEL funcID = NSSelctorFromString(@"func");

? ? NSString* funcName = NSStringFromSelctor(funcID)

2. 動(dòng)態(tài)綁定

動(dòng)態(tài)綁定指的是方法確定的動(dòng)態(tài)性,具體指的是利用OC的消息傳遞機(jī)制將要執(zhí)行的方法的確定推遲到運(yùn)行時(shí),可以動(dòng)態(tài)添加方法,也就是說(shuō),一個(gè)OC對(duì)象是否調(diào)用某個(gè)方法不是由編譯器決定的,而是由運(yùn)行時(shí)決定的;另外關(guān)于動(dòng)態(tài)綁定的關(guān)鍵一點(diǎn)是基于消息傳遞機(jī)制的消息轉(zhuǎn)發(fā)機(jī)制,主要處理應(yīng)對(duì)一些接受者無(wú)法處理的消息,此時(shí)有機(jī)會(huì)將消息轉(zhuǎn)發(fā)給其他接收者處理,具體見(jiàn)下面介紹。

動(dòng)態(tài)綁定是基于動(dòng)態(tài)類型的,在運(yùn)行時(shí)對(duì)象的類型確定后,那么對(duì)象的屬性和方法也就確定了, 包括類中原來(lái)的屬性和方法和運(yùn)行時(shí)動(dòng)態(tài)新加入的屬性和方法,這也就是所謂的動(dòng)態(tài)綁定。動(dòng)態(tài)綁定的核心就是在運(yùn)行時(shí)動(dòng)態(tài)的為類添加屬性和方法,以及方法的最后處理或者轉(zhuǎn)發(fā),主要用到c語(yǔ)言。#include <objc/runtime.h>。

消息傳遞機(jī)制

在OC中,方法的調(diào)用不再理解為對(duì)象調(diào)用其方法,而是要理解成對(duì)象接收消息,消息的發(fā)送采用‘動(dòng)態(tài)綁定’機(jī)制,具體會(huì)調(diào)用哪個(gè)方法直到運(yùn)行時(shí)才能確定,確定后才會(huì)去執(zhí)行綁定的代碼。方法的調(diào)用實(shí)際就是告訴對(duì)象要干什么,給對(duì)象(的指針)傳送一個(gè)消息,對(duì)象為接收者(receiver),調(diào)用的方法及其參數(shù)即消息(message),給一個(gè)對(duì)象傳消息表達(dá)為:[receiver message];?接受者的類型可以通過(guò)動(dòng)態(tài)類型識(shí)別于運(yùn)行時(shí)確定。

在消息傳遞機(jī)制中,當(dāng)開(kāi)發(fā)者編寫(xiě)[receiver message];語(yǔ)句發(fā)送消息后,編譯器都會(huì)將其轉(zhuǎn)換成對(duì)應(yīng)的一條objc_msgSend?C語(yǔ)言消息發(fā)送原語(yǔ),具體格式為:?
void objc_msgSend (id self, SEL cmd, ...)

這個(gè)原語(yǔ)函數(shù)參數(shù)可變,第一個(gè)參數(shù)填入消息的接受者,第二個(gè)參數(shù)是消息‘選擇子’,后面跟著可選的消息的參數(shù)。有了這些參數(shù),objc_msgSend就可以通過(guò)接受者的的isa指針,到其類對(duì)象中的方法列表中以選擇子的名稱為‘鍵’尋找對(duì)應(yīng)的方法,找到則轉(zhuǎn)到其實(shí)現(xiàn)代碼執(zhí)行,找不到則繼續(xù)根據(jù)繼承關(guān)系從父類中尋找,如果到了根類還是無(wú)法找到對(duì)應(yīng)的方法,說(shuō)明該接受者對(duì)象無(wú)法響應(yīng)該消息,則會(huì)觸發(fā)‘消息轉(zhuǎn)發(fā)機(jī)制’,給開(kāi)發(fā)者最后一次挽救程序崩潰的機(jī)會(huì)。

轉(zhuǎn)載于:https://www.cnblogs.com/16zj/p/7693257.html

總結(jié)

以上是生活随笔為你收集整理的Objective-C语言的动态性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。