另一份有點難的 iOS 面試題

Cyandev發表於2018-07-30

這一年的時間已經經歷了實習、校招好幾次的面試了,對於每個準備找工作或者已經找到工作的人來說,準備面試題都是一次提升自己的機會。但比較慶幸的是,本人幾次面試所遇到的問題都比較簡單,沒有太多能讓自己有所提升的內容,而網上流傳的各種面試題如今看來也沒有什麼太大的新意。因此我決定自己出一份面試題,真正有一點難度的面試題。

對於我個人來說,我不太喜歡那些查一查就能得到答案的題目,比如某個 API 怎麼用,或者某個資料結構怎麼寫等等,因為這些題目其實考察都是肌肉記憶,就算答得好也不代表這個人能力很強,只能說他前期準備工作做得比較好。我下面所提出的幾個問題都是需要一定實踐或者一定經驗才能流暢解答出來的題目,如果這些問題對你來說 so easy,那麼說明你有一定的知識廣度,對問題比較喜歡深入探究。當然了,如果你覺得某幾個問題有些許難度,也沒有太大的關係,能夠說出一個大致的思路也是 ok 的,後期再慢慢摸索一下對自己也是有極大提升的。

下面就來看看我的問題吧!

涵蓋的知識體系

  • UIKit 相關的基礎知識
  • C++ 以及與 Objective-C 的互操作性(沒有接觸過 C++ 的小夥伴可以暫時跳過這部分題目)
  • 程式連結與裝載相關知識
  • Swift
  • Objective-C runtime
  • 計算機網路(基礎)
  • 作業系統(基礎)

面試題

  1. 詳細描述一下 UIViewCALayer 的關係,drawRect 一定會影響效能嗎?UI DynamicsUIKit Animation 的最本質區別是什麼?
  2. 如何用 UIImageView 顯示超大解析度的圖?如果要支援縮放呢?
  3. 瞭解 fishhook 嗎?說說為什麼 fishhook 不能修改非動態連線庫中的符號?
  4. C++ 呼叫虛方法與 Objective-C 發訊息有什麼區別?
  5. 瞭解 placement new 嗎?Objective-C 中如何實現這個功能?
  6. 如何在 ARC 環境下用 C++ 標準庫容器來管理 Objective-C 物件?
  7. idselfsuper 它們從語法上有什麼區別?
  8. isa 是什麼?是指向 Class 物件本身的指標嗎?
  9. block 修改捕獲變數除了用 __block 還可以怎麼做?有哪些侷限性?
  10. NSDictionaryNSHashTable 有什麼區別,它們的使用場景是怎樣的?
  11. 用過 Swift 嗎?如何評價 String index 的設計?
  12. 假設 iPhone 上有一個與伺服器的 TCP 連線,此時 iPhone 忽然斷網,伺服器能在短時間內知會 iPhone 的離線嗎?
  13. 為什麼 Wireshark 不能直接抓取 SSL 的原始資料?
  14. backtrace 是在使用者態實現的嗎?能否講講實現它的大致思路?
  15. malloc 的指標 double free 產生的異常與訪問 freed 指標有可能產生的異常有什麼區別?為什麼訪問 freed 指標不一定產生異常?
  16. RunLoop 是一個不停歇在執行的死迴圈嗎?為什麼?
  17. 看過 runtime 的原始碼嗎?原始碼中常有的 fastpathslowpath 是什麼?
  18. runtime 中 SideTables(不是 SideTable)存在的意義是什麼?
  19. 為什麼 ARC 環境下不允許我們呼叫 [super dealloc]
  20. Objective-C 是如何保證系統升級後的 ABI 穩定性的?
  21. 下面這段虛擬碼存在什麼問題?應該如何改進?
int main(int argc, const char * argv[]) {
    // ...
    
    NSUInteger threadCount = [NSProcessInfo processInfo].activeProcessorCount;
    NSCondition *cond = [NSCondition new];
    for (int i = 0; i < threadCount; i++) {
        [NSThread detachNewThreadWithBlock:^{
            while (YES) {
                [cond lock];
                while (/* Queue is empty */) {
                    [cond wait];
                }
                // Dequeue an item.
                [cond unlock];
                // Handle the item.
            }
        }];
    }

    while (YES) {
        // Enqueue something when it comes.
        [cond broadcast];
    }
    
    // ...
}
複製程式碼

雖然只有 21 道題,但相關問題還是很多很多的,日後我可能也會寫一篇文章來解答一下所有的問題,當然我更希望大家能夠自己完成這些問題,不要嘗試直接搜答案,很多題也許根本搜不到答案,所以自己探究的過程一定是必不可少的,加油吧!

相關文章