一、關於面試機會
由於種種原因,4月中本人毅然離開了上一家公司,緊接著開始投入到所謂的“3金4銀”的就業求職黃金期中。
經過自己一番篩選後,前前後後四天總共面了10家左右。截止目前,已定offer一個,主動拒絕一個。當然,原本還有兩家也是很有希望拿offer的,因為本人不願意接受“9106”的上班模式或拒絕提供薪資銀行流水,然後就沒有然後了。
就個人面試經歷來看,深圳iOS行業面試機會還是比較多的,其中還不乏有些公司主動找上門的。在技術面要求上,不同規模的公司各有差異,大公司除了關注iOS基礎,也非常注重演算法及資料結構。
由於本人非計算機科班出身,每逢演算法必輸……演算法顯得尤為重要,只有發憤圖強了。
據個人面試經歷及觀察,OC仍是iOS開發的主流,基本上沒遇到明確使用Swift開發的專案。當然個人還是比較看Swift的,正在Swift道路上努力中……
最近還遇到比較怪的事情,HR在電話預約面試的時候竟然還會先來個iOS基礎快問快答環節,真是。。。因吹絲挺。。。。
扯遠了,寫文字的目的是為了分享一下這幾天在面試中遇到感覺比較有價值的筆試題和麵試題。
二、筆試、面試題
1.演算法題
(1).請在1000萬個整型資料中以最快的速度找出其中最大的1000個數?
這是一個經常被問到的問題,百度網上解法也很多。
這裡僅提供基本思路,供參考:把1000萬的整型平均分到合適n個檔案中,分別對每一份檔案找出前1000個最大的數,最後對每份檔案前1000資料用常規演算法合併即可。
那麼,如何從每一份檔案中找出前1000個最大的數呢?
先取檔案中前1000個數放到陣列中,並排好序(假設升序),之後從檔案中讀取下一個數與陣列第一個數比較,如果比陣列中第一個數大,則替換陣列第一個數,並重新排序,之後再取下一個數進行下輪比較即可。
(2) .迴圈連結串列題:一個有序循的整形環連結串列斷開了,請插入一個整形數,使得連結串列仍然是有序的。
解題思路:請百度……哈哈。
2. OC題
(1).Block中可以修改全域性變數,全域性靜態變數,區域性靜態變數嗎?
答案,可以。 原因請參考深入研究Block捕獲外部變數和__block實現原理
(2)程式碼分析題,以下程式碼輸出結果是什麼?
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, weak) NSString *weakString;
strongString = [NSString stringWithFormat:@"%@",@"string1"];
weakString = strongString;
strongString = nil;
NSLog(@"%@", weakString);
複製程式碼
答案: string1,原因:@"string1" 初始化 retainCount == 1; strongString 指向@"string1"物件, retainCount +1,strongString = nil, retainCount -1,最後retainCount == 1,所以輸出是string1。
抱歉,此題之前給的方向有誤。
感謝@Mr_Wei,@毿毿肆肆 iOS 兩位大佬提供的解題思路。 答案輸出結果仍然是string1,具體請參考兩位大佬的評論,謝謝。
(3)SDWebImage實現原理是什麼? 它是如何解決tableView的複用時出現圖片錯亂問題的呢?
答案:原理請參考iOS開發之SDWebImage原理,解決tableView複用錯亂問題:每次都會調UIImageView+WebCache檔案中的
[self sd_cancelCurrentImageLoad];
(4)iOS事件響應鏈機制是什麼?
答案:iOS 事件響應鏈
(5)如圖view上有橫向排列label1 和 label2, label1,label2間距固定,內容動態變化。 請使用AutoLayout建立約束,保證label2內容要完全顯示,label1內容自適應?
答案:請參考iOS AutoLayout使用技巧(5)對runtime和runloop瞭解嗎?
5.1 runtime:又稱執行時,是一套底層的C語言API。 runtime應用場景:
a.字典模型自動轉化(MJExtension,YYModel)
b.系統方法互動(Swizzle黑魔法)
c.萬能控制器跳轉(通過推送傳過來控制器名稱,屬性等)
d.給分類(category)新增屬性(實現setter、getter方法)
e.實現自動歸檔和解歸檔(原理與a類似)
5.2 runloop: 從字面上講就是一個執行迴圈,內部是do-while迴圈,在這個迴圈內部處理各種任務。 一個執行緒對應一個runloop,主執行緒的迴圈預設啟動,子執行緒的runloop得手動啟動(呼叫run方法)。 runloop只能選擇一個Model啟動,如果當前Model中沒有任務Source(Source0, Source1)、Timer,那麼就直接退出runloop. runloop的作用:保持程式持續執行,處理App中各種事件。通過runloop,有事情執行,沒事休息,可以節省Cpu資源,提高程式效能。
runloop應用: a.
想更深入瞭解runloop,請看大牛部落格深入理解RunLoop。
或者看這個視訊iOS線下分享《RunLoop》by 孫源@sunnyxx
3. Swift題
(1)struct 和 class 的區別?
答案:
區別:
a. 類可以繼承,結構體不可以
b. 可以讓一個類的例項來反初始化,釋放儲存空間,結構體做不到
c. 類的物件是引用型別,而結構體是值型別。所以類的賦值是傳遞引用 ,結構體則是傳值。
相同點:
a,類和結構體都可以擴充套件
b,定義屬性用於儲存值
c,定義方法用於提供功能
d,定義下標用於通過下標語法訪問值
e,定義初始化器用於生成初始化值
(2)class與staitc關鍵字的區別?
a. static 可以在類、結構體、或者列舉中使用。而 class 只能在類中使用。
b. static 可以修飾儲存屬性,static 修飾的儲存屬性稱為靜態變數(常量)。而 class 不能修飾儲存屬性。
c. static 修飾的計算屬性不能被重寫。而 class 修飾的可以被重寫。
d. static 修飾的靜態方法不能被重寫。而 class 修飾的類方法可以被重寫。
e. class 修飾的計算屬性被重寫時,可以使用 static 讓其變為靜態屬性。 f. class 修飾的類方法被重寫時,可以使用 static 讓方法變為靜態方法。
(3)swift是如何解決迴圈引用問題的?
答案: 請參考:Unowned 還是 Weak?生命週期和效能對比
4. 效能優化題
(1)瞭解App進行效能優化嗎,影響App啟動時間的因素有哪些?
答:1.1 App效能優化涉及方面很多。個人感覺面試官主要想知道作為開發人員,對Instruments工具的瞭解及使用情況,關於 Instruments裡面工具: Time Profiler: 效能分析
Zombies:殭屍物件檢測
Allocations:記憶體檢查
Leaks:記憶體洩露檢測。
1.2 響應App啟動時間的因素大體分為pre-main(執行App main函式前時間)和main(執行App main函式時間)兩部分。 詳細分析請參考[iOS]一次立竿見影的啟動時間優化