iOS面試題04-runtime

runtime/KVO等面試題

1.KVO內部實現原則面試

回答:1>KVO是基於runtime機制實現的數組

   2>當某個類的對象第一次被觀察時,系統就會在運行期動態地建立該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。異步

派生類在被重寫的setter方法實現真正的通知機制(Person->NSKVONOtifying Person)函數

 Person類對象p設置self控制器且設置監聽屬性,就會調用observeValueForKeyPath方法,當Person類的屬性被改變時,就會動態生成一個子類繼承自Person類(NSKVONotifying_Person),重寫setAge方法,內部調用父類setAge方法,通知監聽器線程

[監聽器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];設計

原先age屬性不改變時p對象 isa指向Person,當age屬性改變時p對象 isa指向NSKVONotifying_Person(setAge從新內部就會傳遞變量至父類且通知監聽器age屬性改變)3d

2.是否能夠把比較耗時的操做放在NSNotificationCenter中對象

回答:1>若是在異步發送通知,那麼能夠執行比較耗時的操做blog

        2>若是在主線程發送通知,那麼就不能夠執行比較耗時的操做繼承

 圖--2

圖---1

3.Foundation對象與Core Foundation對象有什麼區別

回答:1>Foundation對象是OC的,Core Foundation是C語言對象

         2>Foundation對象和Core Foundation對象能夠互相轉換的,數據類型之間的轉換

     ARC:__bridge_retained/__bridge_transfer

   非ARC:__bridge

 

4.不用中間變量,用兩種方法交換A和B

回答:A= A + B

       B= A -B

      A = A - B

     或者

    A= A^B

   B = A ^ B

   A = A^B;

5.簡單描述下對單例模式設計的理解?

回答:節省內存資源,一個應用就一個對象

 

6.什麼是動態,舉例說明

1>在程序運行過程才執行的操做,例如KVO的內部實現原理,一個類的屬性值隨着程序運行監聽屬性值的變化

 

7.runtime實現機制是什麼,怎麼用,通常用於嘛,你還能記得你所使用的相關頭文件或者某些方法的名稱嗎?

回答:運行時機制,runtime庫裏面包含了跟類/成員變量/方法相關的API,好比獲取類裏面的全部成員變量,爲類動態添加成員變量,動態改變類的方法實現,爲類動態添加新的方法等,須要導入<objc/message.h><objc/runtime.h>

1>runtime,運行時機制,它是一套C語言庫

什麼是runtime?

2>實際上咱們編寫的全部OC代碼,最終都是轉成了runtime庫的東西,好比類轉成了runtime庫裏面的結構體等數據類型,方法轉成了runtime庫裏面的C語言函數,平時調方法都是轉成了objc_msgSend函數(因此說OC有個消息發送機制)

3>所以,能夠說runtime是OC的底層實現,是OC的幕後執行者

runtime有啥用?

1>能動態產生一個類、一個成員變量、一個方法

2>能動態修改一個類、一個成員變量、一個方法

3>能動態刪除一個類、一個成員變量、一個方法

常見的函數、頭文件

#import <objc/runtime.h> : 成員變量、類、方法

class_copyIvarList : 得到某個類內部的全部成員變量

class_copyMethodList : 得到某個類內部的全部方法

class_getInstanceMethod : 得到某個具體的實例方法(對象方法,減號開頭)

class_getClassMethod : 得到某個具體的類方法 (加號)

method_exchangeImplementations : 交換2個方法的實現

#import <objc/message.h> 消息機制

objc_msgSend(...);

 

圖解:平時用OC代碼設置變量值都轉成以下圖所示

  

 

圖解:runtime機制能夠看到很底層的實現,甚至成員變量是私有的。

圖解:runtime實現遍歷全部成員變量

 圖解:使用runtime機制,UIImage類交換2個方法的實現(imageWithName和imageNamed)

可是若是在imageWithName方法內在調用imageNamed就會致使死循環。

交換2個方法的好處:之後一個大項目當中的一個方法使用過多,想動一些手腳和操做,就能夠很方便實現。

 

 

圖解:修改addObject方法不爲空才添加到數組

圖解:修改objectAtIndex方法並查看是否越界,如越界返回null,runtime還可防止程序崩潰

附註:self.book[4]執行實際調用objectAtindex方法。

相關文章
相關標籤/搜索