RunTime面試題及答案

2021-08-14 01:19:21 字數 1913 閱讀 4961

問題:objc在向乙個物件傳送訊息時, 發生了什麼?

1.根據物件的isa指標找到類物件id, 在查詢類物件裡面的methodlists方法函式列表

2.如果沒有在好到, 在沿著superclass, 尋找父類,再在父類methodlists方法列表裡面查詢

3.最終找到sel, 根據idsel確認imp(指標函式), 在傳送訊息.

問題:什麼時候會報unrecognized selector錯誤?ios有哪些機制來避免走到這一步?

1.當傳送訊息的時候, 我們會根據類裡面的methodlists列表去查詢我們要動用的sel, 當查詢不到的時候, 我們會一直沿著父類查詢

2.當最終查詢不到的時候我們會報unrecognized selector錯誤, 當系統查詢不到方法的時候, 會呼叫+(bool)resolveinstancemethod:(sel)sel動態解釋的方法來給我一次機會來新增, 呼叫不到的方法.

3.或者我們可以再次使用-(id)forwardingtargetforselector:(sel)aselector重定向的方法來告訴系統,該呼叫什麼方法,一來保證不會崩潰.

問題:能否向編譯後得到的類中增加例項變數?能否向執行時建立的類中新增例項變數? 為什麼?

1.不能向編譯後得到的類增加例項變數.

2.能向執行時建立的類中新增例項變數.

解釋:

1. 編譯後的類已經註冊在runtime中,類結構體中的objc_ivar_list例項變數的鍊錶和instance_size例項變數的記憶體大小已經確定,runtime會呼叫class_setvarlayoutclass_setweaklvarlayout來處理strong``weak引用.所以不能向存在的類中新增例項變數.

2. 執行時建立的類是可以新增例項變數,呼叫class_addivar函式. 但是的在呼叫objc_allocateclasspair之後,objc_registerclasspair之前,原因同上.

問題:runtime如何實現weak變數的自動置nil?

1.runtime對註冊的類, 會進行布局,對於weak物件會放入乙個hash表中。 用weak指向的物件記憶體位址作為key,當此物件的引用計數為0的時候會dealloc.

2.假如weak指向的物件記憶體位址是a,那麼就會以a為鍵, 在這個weak表中搜尋,找到所有以a為鍵的weak物件,從而設定為nil.

問題:給類新增乙個屬性後,在類結構體裡哪些元素會發生變化

1.instance_size:例項的記憶體大小.

2.objc_ivar_list *ivars: 屬性列表.

面試題及答案

1.css優先順序演算法如何計算 2.css盒子模型 3.new操作符具體幹了什麼呢 4.dom操作 怎樣新增 移除 複製 建立和查詢節點 5.js有幾種資料型別,分別是什麼 6.js如何判斷乙個陣列 7.如何通過指定名稱建立乙個元素 8.在jquery 中,如何給動態新增的元素繫結事件 9.如何獲...

Google面試題 及答案

1 村子裡有100對夫妻,其中每個丈夫都瞞著自己的妻子 村里的每個妻子都能立即發現除自己丈夫之外的其他男人是否 唯獨不知道她自己的丈夫到底有沒有 村里的規矩不容忍通姦。任何乙個妻子,一旦能證明自己的男人 就必須當天把他殺死。村里的女人全都嚴格照此規矩辦事。一天,女頭領出來宣布,村里至少有乙個丈夫 請...

Hibernate面試題及答案

1.在資料庫中條件查詢速度很慢的時候,如何優化?1.建索引 2.減少表之間的關聯 3.優化sql,盡量讓sql很快定位資料,不要讓sql做全表查詢,應該走索引,把資料量大的表排在前面 4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量資料 2.在hibernate中進行多表查詢,每...