超實用的ios面試技巧,值得收藏……

}

3

Swift

●舉例說明Swift裡邊有哪些是Objective-C中沒有的?

Swift引入了在Objective-C中沒有的一些高級數據類型,例如tuples(元祖),可以使你創建和傳遞一組數值。

Swift還引入了可選項類型(Optionals),用於處理變量值不存在的情況。可選項的意思有兩種,一種變量是存在的,例如等於X,而是變量值根本不存在。Optionals類似於Objective-C中指向nil的指針、但是適用於所有的數據類型,而非僅僅侷限於類,Optionals相比於Objective-C中nil指針更加安全簡明,並且也是Swift諸多最大功能的核心。

4

KVO-KVC

●KVC的底層實現?

當一個對象調用setValue方法時,方法內部會做以下操作:

①檢查是否存在相應key的set方法,如果存在,就調用set方法

②如果set方法不存在,就會查找與key相同名稱並且帶下劃線的成員屬性,如果有,則直接給成員屬性賦值

③如果沒有找到_key,就會查找相同名稱的屬性key,如果有就直接賦值

④如果還沒找到,則調用valueForUndefinedKey:和setValue:forUndefinedKey:方法。

這些方法的默認實現都是拋出異常,我們可以根據需要重寫它們。

●KVO的底層實現?

- kvo基於runtime機制實現。

- 使用了isa混寫(isa-swizzling),當一個對象(假設是person對象,person的類是MYPerson)的屬性值(假設person的age)發生改變時,系統會自動生成一個類,繼承自MYPerson:NSKVONotifying_MYPerson,在這個類的setAge方法裡面,調用[super setAge:age] [self willChangeValueForKey:@"age"] 和 [self didChangeValueForKey:@"age"],而這兩個方法內部會主動調用監聽者內部的 - (void)observeValueForKeyPath 這個方法。

- 想要看到NSKVONotifying_MYPerson很簡單,在self.person.age = 20; 這裡打斷點,在調試區域就能看到_person->NSobject->isa=(Class)NSKVONotifying_MYPerson,同時我們在 self.person = [[MYPerson alloc]init];後面打斷點,看到_person->NSObject->isa=(Class)MYPerson,由此可見,在添加監聽者之後,person類型已經由MYPerson被改變成NSKVONotifying_MYPerson

5

結語

有人說iOS行情越來越難,其實這種說話並不準確,在移動網絡愈加普及的今天,iOS程序員失業的情況是不會出現的。目前市場上iOS初級開發者人滿為患,

但中級高級的開發者依舊非常稀缺,在這個時候,就需要提高自己的技術。


分享到:


相關文章: