2018.4月份iOS面試經歷

1、關於面試機會

因爲種種緣由,4月中本人毅然離開了上一家公司,緊接着開始投入到所謂的「3金4銀」的就業求職黃金期中。html

通過本身一番篩選後,前先後後四天總共面了10家左右。截止目前,已定offer一個,主動拒絕一個。固然,本來還有兩家也是頗有但願拿offer的,由於本人不肯意接受「9106」的上班模式或拒絕提供薪資銀行流水,而後就沒有而後了。面試

就我的面試經從來看,深圳iOS行業面試機會仍是比較多的,其中還不乏有些公司主動找上門的。在技術面要求上,不一樣規模的公司各有差別,大公司除了關注iOS基礎,也很是注重算法及數據結構。算法

因爲本人非計算機科班出身,每逢算法必輸……算法顯得尤其重要,只有發憤圖強了。swift

據我的面試經歷及觀察,OC還是iOS開發的主流,基本上沒遇到明確使用Swift開發的項目。固然我的仍是比較看Swift的,正在Swift道路上努力中……數組

最近還遇到比較怪的事情,HR在電話預定面試的時候居然還會先來個iOS基礎快問快答環節,真是。。。因吹絲挺。。。。性能優化

扯遠了,寫文本的目的是爲了分享一下這幾天在面試中遇到感受比較有價值的筆試題和麪試題。bash

2、筆試、面試題

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]一次立竿見影的啓動時間優化

相關文章
相關標籤/搜索