Objective-C語言的動態性

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

一、編譯時和運行時

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

運行時:即程序通過編譯這一關后,編譯好的代碼被裝在到內存中這個階段,這個時候會對具體內存進行檢查,而不僅僅對代碼的簡單掃描分析,此時若出錯誤程序會崩潰。

可以說編譯是一個靜態的階段,類型錯誤很明顯可以直接檢查出來,可讀性好,而運行時則是動態的階段,尅是具體與運行環境結合起來。

二、oc語言的動態性

? 含義:oc語言的動態性主要體現在三個方面:動態類型(Dynamic typing)、動態綁定和動態加載。

? 1.動態類型

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

示例:

    // 編譯的時候人為obj是一個nsstring對象NSString* obj = [[NSData alloc]init];// 編譯通過,運行的時候直接崩潰[obj stringByAppendingString:@"string"];

  通過這里就可以知道,將類型的確定延遲到運行時,體現了oc語言的一種動態性:動態類型。

動態類型的識別方法

(1)首先是Class類型

? ? Class class = [NSObject class]; // 通過類名得到對應的Class動態類型

? ? Class class = [obj class];? ? ? ? ?// 通過實例對象得到對應的Class動態類型

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

(2)Class動態類型和類名字符串的相互轉換

? ? NSClassFromString(@"NSObject");

? ? NSStringFromClass([NSObject class]);

? ? NSStringFromClass([obj class]);

? (3) 判斷對象是否屬于某種動態類型:

? ?- (BOOL)isKindOfClass:class

? ?- (BOOL)? isMemberOfClass:obj?

? (4)判斷類中是否有對應的方法:

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

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

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

? ? SEL funcID = @select(func);

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

? ? NSString* funcName = NSStringFromSelctor(funcID)

2. 動態綁定

動態綁定指的是方法確定的動態性,具體指的是利用OC的消息傳遞機制將要執行的方法的確定推遲到運行時,可以動態添加方法,也就是說,一個OC對象是否調用某個方法不是由編譯器決定的,而是由運行時決定的;另外關于動態綁定的關鍵一點是基于消息傳遞機制的消息轉發機制,主要處理應對一些接受者無法處理的消息,此時有機會將消息轉發給其他接收者處理,具體見下面介紹。

動態綁定是基于動態類型的,在運行時對象的類型確定后,那么對象的屬性和方法也就確定了, 包括類中原來的屬性和方法和運行時動態新加入的屬性和方法,這也就是所謂的動態綁定。動態綁定的核心就是在運行時動態的為類添加屬性和方法,以及方法的最后處理或者轉發,主要用到c語言。#include <objc/runtime.h>

消息傳遞機制

在OC中,方法的調用不再理解為對象調用其方法,而是要理解成對象接收消息,消息的發送采用‘動態綁定’機制,具體會調用哪個方法直到運行時才能確定,確定后才會去執行綁定的代碼。方法的調用實際就是告訴對象要干什么,給對象(的指針)傳送一個消息,對象為接收者(receiver),調用的方法及其參數即消息(message),給一個對象傳消息表達為:[receiver message];?接受者的類型可以通過動態類型識別于運行時確定。

在消息傳遞機制中,當開發者編寫[receiver message];語句發送消息后,編譯器都會將其轉換成對應的一條objc_msgSend?C語言消息發送原語,具體格式為:?
void objc_msgSend (id self, SEL cmd, ...)

這個原語函數參數可變,第一個參數填入消息的接受者,第二個參數是消息‘選擇子’,后面跟著可選的消息的參數。有了這些參數,objc_msgSend就可以通過接受者的的isa指針,到其類對象中的方法列表中以選擇子的名稱為‘鍵’尋找對應的方法,找到則轉到其實現代碼執行,找不到則繼續根據繼承關系從父類中尋找,如果到了根類還是無法找到對應的方法,說明該接受者對象無法響應該消息,則會觸發‘消息轉發機制’,給開發者最后一次挽救程序崩潰的機會。

轉載于:https://www.cnblogs.com/16zj/p/7693257.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內存泄漏和內存溢出的區別

原文地址https://www.zhihu.com/question/40560123 簡單來說&#xff0c;操作系統就像資源分配人員&#xff0c;你要使用內存的時候分給你&#xff0c;你用完了還給它。如果你使用了沒有分配給你的內存就是內存溢出&#xff0c;如果你用完了沒有還就是內存泄漏。會引起的問題&a…

怎么注銷筆記本icloud_如何在筆記本電腦或臺式機的Web瀏覽器中在線查看Apple iCloud照片

怎么注銷筆記本icloudPicture this: you just returned from a beautiful vacation and want to show all those gorgeous photos to your family. But your phone just died. And since youre at a family dinner your laptop is nowhere to be found.想象一下&#xff1a;您剛…

棒棒糖 宏_棒棒糖圖表

棒棒糖 宏AKA: lollipop plot又名&#xff1a;棒棒糖情節 WHY: a lollipop chart (LC) is a handy variation of a bar chart where the bar is replaced with a line and a dot at the end. Just like bar graphs, lollipop plots are used to make comparisons between diff…

ubuntu上如何安裝tomcat

1. 在官網下載linux里面的tomcat 2. 放到DownLoads下面--把tomcat的壓縮包放到DownLoads3. sudo mkdir /usr/local/tomcat/ -在usr/local/路徑下新建一個tomcat的文件夾4 sudo tar zxvf tomcat。。。。tar.gz -C /usr/local/tomcat/---把解壓后的tomcat放到usr/local/下的tomca…

leetcode 1734. 解碼異或后的排列(位運算)

給你一個整數數組 perm &#xff0c;它是前 n 個正整數的排列&#xff0c;且 n 是個 奇數 。 它被加密成另一個長度為 n - 1 的整數數組 encoded &#xff0c;滿足 encoded[i] perm[i] XOR perm[i 1] 。比方說&#xff0c;如果 perm [1,3,2] &#xff0c;那么 encoded [2,…

ZooKeeper3.4.5-最基本API開發

2019獨角獸企業重金招聘Python工程師標準>>> package cn.itcast.bigdata.zk;import java.io.IOException; import java.util.List;import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEven…

字符串轉換整數python_將Python字符串轉換為Int:如何在Python中將字符串轉換為整數

字符串轉換整數pythonUnlike many other programming languages out there, Python does not implicitly typecast integers (or floats) to strings when you concatenate them to strings.與現有的許多其他編程語言不同&#xff0c;Python在將整數連接到字符串時不會隱式地將…

理解Java里面的必檢異常和非必檢異常

問題&#xff1a;理解Java里面的必檢異常和非必檢異常 Joshua Bloch在"Effective Java"里面說過 在可恢復的條件下和編程錯誤導致的運行時錯誤時&#xff0c;使用必檢異常&#xff08;第二版的第52頁&#xff09; 讓我們來看一下我對這個的正確理解吧 下面是我對…

使用vim打開文件的16進制形式,編輯和全文替換

1、先用vim打開文件的二進制形式&#xff0c;如果不以二進制可能會產生轉換錯誤。 vim -b file-to-open.dat 2、用xxd把文件轉換成十六進制格式 :%!xxd 現在就可以對待普通文本一樣查看和編輯二進制文件了。 3、vim 單文件替換方法 :%s/old/new/gc 全文執行替換,詢問是…

nlp自然語言處理_不要被NLP Research淹沒

nlp自然語言處理自然語言處理 (Natural Language Processing) 到底是怎么回事&#xff1f; (What is going on?) NLP is the new Computer VisionNLP是新的計算機視覺 With enormous amount go textual datasets available; giants like Google, Microsoft, Facebook etc have…

opencv 隨筆

裝環境好累&#xff0c;python3.6&#xff0c;opencv3.4 好不容易裝好了&#xff0c;結果 addweight的時候總是報錯 The operation is neither array op array (where arrays have the same size and the same number of channels), nor array op scalar, nor scalar op array …

js打開飛行模式_什么是飛行模式? 它有什么作用?什么時候應該打開它?

js打開飛行模式If youve flown on an airplane in the last decade and you have a smart phone, youve likely had to put that phone in airplane mode before the plane takes off.如果您在過去的十年中乘坐過飛機&#xff0c;并且擁有一部智能手機&#xff0c;那么您可能必…

在Java 里面怎么比較字符串

問題&#xff1a;在Java 里面怎么比較字符串 到目前為止&#xff0c;我使用 操作符去比較字符串在我的程序里面。然而&#xff0c;卻產生了一個bug&#xff0c;將這個改為了.equals()以后&#xff0c;就把bug修復了 是不是太辣雞了&#xff1f;它什么時候應該被使用或者說是不…

中小型研發團隊架構實踐三要點(轉自原攜程架構師張輝清)

如果你正好處在中小型研發團隊…… 中小型研發團隊很多&#xff0c;而社區在中小型研發團隊架構實踐方面的探討卻很少。中小型研發團隊特別是 50 至 200 人的研發團隊&#xff0c;在早期的業務探索階段&#xff0c;更多關注業務邏輯&#xff0c;快速迭代以驗證商業模式&#xf…

時間序列預測 預測時間段_應用時間序列預測:美國住宅

時間序列預測 預測時間段1.簡介 (1. Introduction) During these COVID19 months housing sector is rebounding rapidly after a downtime since the early months of the year. New residential house construction was down to about 1 million in April. As of July 1.5 mi…

zabbix之web監控

Web monitoring(web監控)是用來監控Web程序的&#xff0c;可以監控到Web程序的下載速度&#xff0c;返回碼以及響應時間&#xff0c;還支持把一組連續的Web動作作為一個整體進行監控。 1.Web監控的原理 Web監控即對HTTP服務的監控&#xff0c;模擬用戶去訪問網站&#xff0c;對…

如何使用Webpack在HTML,CSS和JavaScript之間共享變量

Earlier this week, I read an article explaining how CSS-in-JS slows down the rendering of some React apps and how static CSS is faster. But CSS-in-JS is very popular because, among other features, you can style dynamically using JavaScript variables.本周初…

Java中獲得了方法名稱的字符串,怎么樣調用該方法

問題&#xff1a; Java中獲得了方法名稱的字符串&#xff0c;怎么樣調用該方法 如果我有以下兩個變量 Object obj; String methodName "getName";在不知道obj的類的情況下&#xff0c;我怎么樣才能調用該類的名叫methodName的方法呢&#xff1f; 這個方法被調用時…

經驗主義 保守主義_為什么我們需要行動主義-始終如此。

經驗主義 保守主義It’s been almost three months since George Floyd was murdered and the mass protests. Three months since the nationwide protests, looting and riots across America.距離喬治弗洛伊德(George Floyd)被謀殺和大規模抗議活動已經快三個月了。 全國抗議…

Begin

Hello everyone, Finally,a technician from feiyang help me solve the question. Even though it is not the linux version i want.emmm...linux mint a new one i dont know about it And, lets make the life regular and delicate轉載于:https://www.cnblogs.com/lxc-run…