問題:objc在向乙個物件傳送訊息時, 發生了什麼?
1.根據物件的isa
指標找到類物件id
, 在查詢類物件裡面的methodlists
方法函式列表
2.如果沒有在好到, 在沿著superclass
, 尋找父類,再在父類methodlists
方法列表裡面查詢
3.最終找到sel
, 根據id
和sel
確認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_setvarlayout
或class_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中進行多表查詢,每...