1. 程式人生 > >Runtime的概念。message send如果尋找不到相應的物件,會如何?

Runtime的概念。message send如果尋找不到相應的物件,會如何?

RunTime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。runtime是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。 對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式(C語言的函式呼叫請看這裡 )。編譯完成之後直接順序執行,無任何二義性。OC的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式(事實證明,在編 譯階段,OC可以呼叫任何函式,即使這個函式並未實現,只要申明過就不會報錯。而C語言在編譯階段就會報錯)。只有在真正執行的時候才會根據函式的名稱找 到對應的函式來呼叫。

http://www.jianshu.com/p/927c8384855a

如果用例項物件呼叫例項方法,會到例項的isa指標指向的物件(也就是類物件)操作。

如果呼叫的是類方法,就會到類物件的isa指標指向的物件(也就是元類物件)中操作。

(1)首先,在相應操作的物件中的快取方法列表中找呼叫的方法,如果找到,轉向相應實現並執行。

(2)如果沒找到,在相應操作的物件中的方法列表中找呼叫的方法,如果找到,轉向相應實現執行

(3)如果沒找到,去父類指標所指向的物件中執行1,2.

(4)以此類推,如果一直到根類還沒找到,轉向攔截呼叫。

(5)如果沒有重寫攔截呼叫的方法,程式報錯。

以上的過程給我帶來的啟發:

重寫父類的方法,並沒有覆蓋掉父類的方法,只是在當前類物件中找到了這個方法後就不會再去父類中找了。

如果想呼叫已經重寫過的方法的父類的實現,只需使用super這個編譯器標識,它會在執行時跳過在當前的類物件中尋找方法的過程。

攔截呼叫

在方法呼叫中說到了,如果沒有找到方法就會轉向攔截呼叫。

那麼什麼是攔截呼叫呢。

攔截呼叫就是,在找不到呼叫的方法程式崩潰之前,你有機會通過重寫NSObject的四個方法來處理。

+ (BOOL)resolveClassMethod:(SEL)sel;

+ (BOOL)resolveInstanceMethod:(SEL)sel;

//後兩個方法需要轉發到其他的類處理

- (id)forwardingTargetForSelector:(SEL)aSelector;

-(void)forwardInvocation:(NSInvocation *)anInvocation;

-

-第一個方法是當你呼叫一個不存在的類方法的時候,會呼叫這個方法,預設返回NO,你可以加上自己的處理然後返回YES。

-第二個方法和第一個方法相似,只不過處理的是例項方法。

-第三個方法是將你呼叫的不存在的方法重定向到一個其他聲明瞭這個方法的類,只需要你返回一個有這個方法的target。

-第四個方法是將你呼叫的不存在的方法打包成NSInvocation傳給你。做完你自己的處理後,呼叫invokeWithTarget:方法讓某個target觸發這個方法

相關推薦

Runtime概念message send如果尋找相應物件如何?

RunTime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。runtime是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。 對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式(C語言的函式呼叫請看這裡 )。編譯完成之

導航座標如果座標是道路無法通行獲取最近的道路座標

#,b都是一個一個座標,已知以#為座標 來獲取最近的b點座標 #-*-coding:utf-8-*- l = [8,17]# #座標 ls=[[8,0],[8,1],[8,2],[8,3],[8,4],[8,5],[8,6],[14,3]] # b座標 di={} #鍵是列表的索引,值

Oracle數據庫運維:要對監聽日誌文件(listener.log)進行定期清理如果定期清理遇到下面一些麻煩

tab 額外 機器 寫入 bpa 性能 connect user ini 原文鏈接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?EmPreviewTypeV=2&

讀:只要我還在愛我從不主動離開如果愛了我從不留戀!

自己的 幸福 個人 分享圖片 一起 主動 圖片 ima 也會 今晚在《南川大叔》的公眾號上面,看到這樣的一個配圖:只要我還在愛,我從不主動離開,如果我不愛了,我從不留戀!心中不由有一起感動,或許自己曾經也是這樣的心態而過的,現在的心境也是如此。或許真的經歷過的

python,可變物件可變物件深拷貝淺拷貝

學習整理,若有問題,歡迎指正。 python 可變物件,不可變物件 可變物件 該物件所指定的記憶體地址上面的值可以被改變,變數被改變後,其所指向的記憶體地址上面的值,直接被改變,沒有發生複製行為,也沒有發生開闢新的記憶體地址行為。 python可變物件有,列表,字典,set集合 列如:

學大偉業:如果競賽考好只能裸考走到黑

清華北大是國內最頂級的兩所高校,也是我們廣大競賽生心馳所向的地方,可清北早就不是隻拼平時的學習就能去的了,在衝擊清北時,我們競賽生有著先天的優勢。 我們都知道,競賽生最容易拿到清北降分,可大家知道“裸考”清北到底有多難嗎?裸考錄取人數太少之所以裸考清北太難,是

【為無為事無事味無味】大小多少抱怨以德圖難乎其易也;為大乎其細也;天下之難作於易;天下之大作於細是以聖人終為大故能成其大夫輕諾必寡信;必多難是以聖人猶難之故終無難矣

每天進步一點點。。。 從2009年畢業到現在,做過Java後臺開發,PL/SQL開發,會編寫shell指令碼,現為兼職開發的MySQL DBA。為人友善誠懇,工作踏實,吃苦耐勞,富有朝氣,激情,以及團隊合作意識。

TCP 三次握手和四次揮手的流程為什麼斷開連線要 4 次,如果握手只有兩次出現什麼

·       第一次握手(SYN=1, seq=x):客戶端傳送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號 X,儲存在包頭的序列號(SequenceNumber)欄位裡。傳送完畢後,客戶端進入 SYN_SEND 狀態。·     

最喜歡的一副圖:擁有資源的多少並不重要如果懂得利用永遠都是不夠的!

附上荀子《勸學》的名言,同理: 吾嘗終日而思矣,不如須臾之所學也;吾嘗跂而望矣,不如登高之博見也。登高而招,臂非加長也,而見者遠;順風而呼,聲非加疾也,而聞者彰。假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假於物也。

在受支援的桌面環境中執行Google Chrome時將使用系統代理設定但您的系統受支援或啟動系統配置時出現問題

          linux下對谷歌瀏覽器進行代理設定,會提示那就根據提示查一下man吧引數已經瞭解了,那如何添加了,我們可以再桌面快捷方式的引數中進行配置,不需要代理只需要刪除代理配置項就可以了,,說幹就幹。找到exec項,然後再後面新增重啟瀏覽器就行了,不需要設定代理,

如果沒有開發文件是什麼樣子?

首先,普及一下看圖知識:如何進入連續看圖模式? 1.安裝360瀏覽器 2.滑鼠懸放在圖片上 接著,你就可以隨心所欲的 看圖了            ---------------- 正文  -------

浮點型運算結果是精確的出現精度丟失

float a = 1.1f; float b = 3.1415926f; //輸出結果3.1415925 精度丟失 double b=1.1d; double result = a+b; //結果是2.200000023841858 精度丟失 解析: 第

75道邏輯思維題---作10道智商就是正常作30道就是凡人作60道就是高智商稀有人才了!

【74】一個岔路口分別通向誠實國和說謊國。來了兩個人,已知一個是誠實國的,另一個是說謊國的。誠實國永遠說實話,說謊國永遠說謊話。現在你要去說謊國,但不知道應該走哪條路,需要問這兩個人。請問應該怎麼問? 【75】在一天的24小時之中,時鐘的時針、分針和秒針完全重合在一起的時候有幾次?都分別是什麼時間?你怎樣算出

部署在同一臺機器的不同應用兩個應用的cookie互相影響的問題(如果做了登入攔截導致已登入的應用需要重新登入)

2018年5月29日記    今天在解決專案的bug時發現的一個問題,我們有兩個系統:許可權管理系統(簡稱系統A)、前臺展示系統(簡稱系統B),發現系統A在登入的情況下,如果在開啟一個頁面登入系統B,再回到系統A訪問時會跳轉到登入頁重新登入,導致的結果系統A與系統B不能同時登

JPA在進行update、modify和insert操作時加事務報錯

javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current

JavaScript字串物件為什麼有屬性呢?(理解JavaScript中的包裝物件

例項1: var s = "hello javascript!"; //定義一個字串 var world = s.substring(s.indexOf(" ")+1, s.length); //

關於可變物件可變物件變數

上面我們講了,str是不變物件,而list是可變物件。對於可變物件,比如list,對list進行操作,list內部的內容是會變化的,比如:>>> a = ['c', 'b', 'a'] >>> a.sort() >>> a

應用程序啟動器 “sublime_text.desktop“ 還沒有被標記為 信任如果知道這個文件的來源那麽啟動它可能安全解決sublime在ubuntu中支持中文輸入問題

Go fix sudo ons 啟動 show -- ica 完美 1.下載 git clone https://github.com/lyfeyaj/sublime-text-imfix.git 2.進行一些處理 cd ~/sublime-text-imfix sud

C# 解決子執行緒能操作主執行緒UI(介面)問題涉及到多執行緒的概念

1、在預設情況下,C#不准許在一個執行緒中直接訪問或操作另一執行緒中建立的控制元件,這是因為訪問windows窗體控制元件本質上是不安全的。 2、執行緒之間是可以同時執行的,那麼如果有兩個或多個執行緒同時操作某一控制元件的某狀態,嘗試將一個控制元件變為自己需要的狀態時, 執行緒的死鎖就可能發生。

給定由大寫小寫字母和空格組成的字串返回 最後 一個單詞的長度 如果輸入中存在單詞返回 0

給定由大寫,小寫字母和空格組成的字串,返回 最後 一個單詞的長度。 如果輸入中不存在單詞,返回 0。 注意: “單詞”是指不包含空格符號的字串 例如: 對於字串"hello World"(不帶引號), 那麼返回的結果是 5; 對於字串"abc "(不帶引號),那麼