iOS 面試 常問問題

Yu-J.Cheng
9 min readApr 3, 2017

--

文章出處 cocoaacademy
解答有些是我自行找的,可能會與原文略有不同。

1 — 何謂 memory leak ? 試著舉出三個例子。
Memory Leak 又稱為記憶體洩漏,主要是在程式執行的階段某個被配置(Allocated)的記憶體無法在被參照(Referenced),也無法被釋放
(Released)所導致的。它會造成記憶體的使用量隨著時間慢慢增加,直到系統在也無法負荷而 crash。
通常情況下,導致記記憶體洩漏的原因是未釋放分配的記憶體,而又丟失指向分配塊的指針。

寫得很好的範例網址

2 — 何謂 App Thinning ?
App 瘦身能夠自動偵測使用者的裝置類型(型號),只下載適用於該裝置的內容

詳細說明

3 — 解釋何謂 Auto Layout
Auto Layout 是一個以約束條件為基礎的佈局系統,它可以讓開發者建立一個可以因應不同螢幕尺寸與裝置(device)方向而調整的自適應介面(adaptive interface)

4— 什麼是GCD,他是如何運作的?
GCD 是最接近於操作系統 Unix 底層的,最常見的處理並行代碼和執行異步操作的 API。GCD 負責創建和管理任務隊列

5— Swift 與 Objective-C 相較起來好處有哪些?

  • 容易閱讀。 (真的?)
  • 容易維護。
  • 較安全的。
  • Swift 統一了記憶體管理部分。
  • 打字量少。
  • Swift 運行速度較快。
  • 與開源項目的名稱衝突較少。
  • Swift 支援動態庫(dynamic libraries)。
  • Swift Playgrounds 好用。
  • Swift is a future you can influence.

Here is a link where you can see these assertions in detail

6 — Synchronous vs. Asynchronous in GCD ?

同步Sync 和異步Asyn 的主要區別在於會不會阻塞目前的線程,直到Block(Closure) 中的任務執行完畢。

如果是同步Sync,他會讓主線程等待Block中的任務執行完畢,然後當前線程才會繼續往下運行。

如果是異步Asyn,當前線程會直接往下運行,他不會阻塞當前線程。

7 — 在使用block時 ,使用 _weak修飾變數的原因是?

避免 memory leak。

8 — What is the GCD method you call to pass some work to a queue asynchronously? What parameters do you provide to this method?

dispatch_async(dispatch_get_main_queue(), ^{ });
We pass as a parameter the dispatch queue where we want to execute the code.

9 — 當你使用較新版本的APIs時,當你的APP支援較舊的版本;你如何保證運行時不會crash?例如你使用iOS7以後才有的方法,同時你的APP也支援iOS6。

下判斷式取得user的版本,再做處理。(原文有範例)

You can see this topic in more detail here.

10 — 什麼是 MVC ?

MVC 模式是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型 Model、視圖 View 和控制器 Controller。
Apple官方定義View和Model只能透過Controller來發生關係。

11 — 什麼是 delegates ?

delegate 就是 將眾多的 callback,集中在一個物件上 。

比較多的面試官會問你如何寫。以及寫作的經驗等等。

12 — NSNotificationCenter 是什麼,它是如何運作的?
Notification Center 是在 Cocoa/Cocoa Touch Framework 中,物件之間可以不必互相知道彼此的存在,也可以互相傳遞訊息、交換資料/狀態的機制。

我們可以把 Notification Center 想像是一種廣播系統。當一個物件 A 的狀態發生改變,而有多個物件需要知道這個物件發生改變的狀況下,物件 A 不必直接對這些物件發出呼叫,而是告訴一個廣播中心說:「我的狀態改變了」,至於其他需要聽取狀態的物件呢,也只要對這個廣播中心訂閱(subscribe)指定的通知,所以當物件 A 發出通知的時候,這個廣播中心就會通知有訂閱通知的其他物件。這個廣播中心,就是 Notification Center。

13 — Core Data是什麼 ?
Core Data 是一個設計用來儲存資料的框架,背後操作的雖然仍是 SQLite ,但其簡化了資料庫的處理,讓你不用了解 SQL 指令也可以快速的為應用程式建立並使用資料庫。

14 — managed object context是什麼?

managed object context參與對數據對象進行各種操作的全過程,並監測資料對象的變化,以提供對undo/redo的支持及更新綁定到資料的UI。

15 — frame 與bounds的差異 ?
frame: 該view在父view座標系统中的位置和大小。(参照父view的座標)
bounds:該view在本地座標系统中的位置和大小。(簡單來說,就是0.0

16 — What is the purpose of the reuseIdentifier ?
已經分配的對象的可重用性。(tableview 可以看到)

17 — 第一次載入UITableView時,有多少 UITableViewCells 被分配記憶體? 當你下滑拉動時,有多少新的Cell被分配記憶體?

UITableViewCells 會分配差不多剛好的數量,藉由reuseIdentifier重複使用,避免載入過多的cell吃掉記憶體。

18 — 定義atomic 與nonatomic.
atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

  • atomic : 變量默認是有該有屬性的,這個屬性是為了保證在多線程的情況下,編譯器會自動生成一些互斥加鎖的代碼,避免該變量的讀寫不同步的問題。
  • nonatomic : 如果該對象無需考慮多線程的情況,這個屬性會讓編譯器少生成一些互斥代碼,可以提高效率。

If you want to know more about this check this article

19 — weak與strong差異
strong 指向 a ,代表該物件持有 a。retain +1
weak 指向的對象,只要没有其他strong指向該對象,ARC會在適合的時機釋放它 。

20 — What’s the difference between not-running, inactive, active, background and suspended execution states?
iOS應用主要分為5種狀態。

Not Running (非運行狀態)。應用沒有運行或被系統終止。
Inactive(前台非活動狀態)。應用正在進入前台狀態,但不能接受事件處理。
Active(前台活動狀態)。應用進入前台狀態,能接受事件處理。
Background(後台狀態)。應用進入後台後,依然能夠執行代碼。如果有可執行的代碼,就會執行代碼,如果沒有可執行的代碼或者可執行的代碼執行完畢,應用會馬上進入掛起狀態。
Suspended(掛起狀態)。處於掛起的應用進入一種“冷凍”狀態,不能執行代碼。如果系統內存不夠,應用會被終止。。

21 —category 是什麼?

擴充某個 class 功能,增加新的成員變數與 method。而不使用繼承。

22 — viewDidLoad 與viewDidAppear差異?當你從遠端伺服器下載資料回來時,你應該使用哪個方法更動畫面。

viewDidLoad 在畫面被載入好時呼叫,無論是從Xib file, storyboard 或是程式碼刻的畫面。
viewDidAppear 在每次畫面出現時都會呼叫一次。
實際開發時,當資料時常有變動,寫在viewDidAppear是比較好的。

無論是哪個情況下,資料的載入都必須要寫在背景異步執行,以避免阻擋UI。

23 — 使用delegate and notification的差異在哪?

同樣是發送訊息,對使用delegate就像是一對一的電話,物件與物件單一的溝通,我可以知道何時開始與結束。
notification像是廣播,收到通知的人會處理訊息,但是我無法確保它何時會收到與動作。

(原文不翻)

24 — 當您方法指向nil會發生什麼?
在Objective-C中發送給一個nil對象的訊息是完全可以接受的,它被視為無操作。
沒有辦法將其標記為錯誤,因為它不是錯誤,實際上它可能是一個非常有用的功能。

25 — 哪個更快:遍歷NSArray或NSSet?
NSSet在尋找時提供較好的效能;原因是NSSet使用 雜湊值來查找項目(如字典),而數組必須遍歷其整個內容以查找特定對象。

文章出處:

26 — Live Rendering 如何設定?

利用 IBDesignable 和 IBInspectable 功能建構客製化 control 並即時在 Interface Builder 預覽變更。

Appcoda中文詳細介紹

27 — 什麼是 B-Trees?

B樹是搜索樹,提供具有優良性能特徵的有序鍵值存儲。
原則上,每個節點維護一個自己的元素的排序數組,另一個數組為其子節點。

28— NSError object 是由什麼組成的?

官方定義:
Information about an error condition including a domain, a domain-specific error code, and application-specific information.

包含 domain,domain 錯誤代碼,以及由字典組成的特別的訊息。

29 — What is Enum?

枚舉類型基本上包含了一組相關的值。

30 — bounding box 是什麼?

bounding box是在幾何中使用的術語;它指的是在一組給定的點內最小的度量(面積或體積)。

官方定義:
返回包含圖形路徑中所有點的邊界框。(回傳一個CGRECT)

--

--