ios開發者談談技術面試那些坑 | 掘金技術徵文

董永勝發表於2019-02-04

                                       ios開發者談談技術面試那些坑 | 掘金技術徵文

    轉眼又是秋季,是結束也是一場開始,離開了校園,我們中的大多數將要開始自己的職場生涯,我也是從大四開始漂泊北京,來來回回面試過幾十次,經驗豐富談不上,但總是有可以說一說的東西。

    首先,簡歷的製作,技術崗位求職要懂得HR看中你的地方,技術、人品,簡歷就是簡單的陳述你的經歷,不可做的太過於囉嗦,關鍵的地方要是你做過的專案,並介紹專案裡的技術點和實現的功能,這裡推薦智聯的簡歷模板。有些同學剛剛畢業專案經驗很少可以填寫一些自己在校的程式設計比賽經歷、實習專案等等。其次一些好的興趣和活動經歷是可以反應一個人的人品的,不要忽視一些小的細節,比如在上一家公司工作的時間,一般少於一年的就不要往上寫了,這會令HR感到你的穩定性很差,招你進來會對公司造成損失的。好好過自己,牌已經發給你了,就看你如何打,我認識一個女生,是Dota世界女子組冠軍,去摩根面試程員,前面的一堆技術問題回答的並不好,正覺無望的時候,面試官無意中看到她的玩遊戲經歷,後面半個小時竟然都在講遊戲,最後成功面上。並不是鼓勵你們去玩遊戲,只是想讓你們懂的人生的每個節點都可以很精彩,要想精彩需要我們的思考樂觀和努力,這也是面試官看中你的一點。

    開始如果沒有什麼內推的機會的話,我還是推薦你們用智聯來投遞簡歷。收到面試通知的電話的後要把面試時間安排的近一些,我就有過因為多等了一天而錯失機會的經歷,不過也應該謹慎一些,去該公司官網檢視一下他們的經營業務,一是為了防騙,二來可以在面試的時候有的放矢的針對該公司的需求技術侃侃而談。面試路上,在北京的話轉一圈真的挺費勁的,出行選擇地鐵避免堵車,帶充電寶,紙質簡歷,吃好穿好,照顧好自己,時刻給自己鼓勵,我們的技術不好可以學,可我們一直要做最好的自己。

    提前半小時到,禮貌用語。基本的面試流程就是做一套題(根據具體公司而定),HR帶你去一間小屋等候面試官的面試,開始面試官會看你的簡歷,這時候你要做一下簡單的自我介紹,概括補充你簡歷上面的內容,後面是一些技術問題,所以應該提前多做準備,後面我會總結一些關於ios的面試題。面試官有的凶狠咄咄逼人,有的很和婉,都不要怕,如實回答,落落大方就好了,千萬不要委屈了自己,將就了一個比自己預期很低的薪水,那樣會後悔很久的。有一次竟然遇到群面,兩個面試官,我們四個面試者坐對面長凳,有需要搶答的問題,有需要我們輪流來答的問題,放平心態,儘量揚長避短,發揮自己的長處。

    面試後可以做一個表單,記錄面試的公司、地址、面試情況、薪資情況等,方便自己對照檢視,好記性不如爛筆頭,良好的分類記錄是很有幫助的,這也受用於你工作後。有幾次面試後總是後悔,後悔沒有要到面試官的微信,比如一次面試官是高我幾屆的同校學長,有一次是來自谷歌的工程師,要到微信後可以三天後問候一下,難免會有忘記通知的情況,再來這也是你的資源,畢竟都是大牛,我們的面試也是一次開闊自己的經歷。

    玄學,人都是需要一些運氣的,面試也不能逃脫,有的公司可能只是為了解決一個技術問題並不真正的招聘,有的卻是真正的急需招人,前者你技術再好也進不去,後者倒可以不是那麼艱難,開始來北京的時候,我也是有這樣的運氣,很冷,從很遠的地方匆匆趕來,差不多想要放棄了,卻被錄取了,有一定的運氣,所以千萬不要放棄任何的一次機會,所謂,柳暗花明又一村。

                 ios開發者談談技術面試那些坑 | 掘金技術徵文

華麗的分割線    

下面分享一些總結的面試題,希望能有幫助

1、viewWillAppear和viewDidLoad這兩個方法誰會先被呼叫。

viewDidLoad先被呼叫,一個是load載入一個是appear呈現。複製程式碼

2、代理和block的區別。

block 和 delegate 都可以通知外面。block 更輕型,使用更簡單,能夠直接訪問上下文,這樣類中不需要儲存臨時資料,使用 block 的程式碼通常會在同一個地方,這樣讀程式碼也連貫。delegate 更重一些,需要實現介面,它的方法分離開來,很多時候需要儲存一些臨時資料,另外相關的程式碼會被分離到各處,沒有 block 好讀。複製程式碼

3、算是問題2的深入,單例裡面的方法回撥要用什麼方法。

需要用block,因為用代理的話,如果多個物件同時呼叫單例的方法,那麼只有最後一個物件能夠得到響應。複製程式碼

4、TCP和UDP的區別。

TCP(Transmission Control Protocol,傳輸控制協議)是面向連線的協議,也就是說,在收發資料前,必須和對方建立可靠的連線。一個TCP連線必須要經過三次“對話”才能建立起來,其中的過程非常複雜。

UDP(User Data Protocol,使用者資料包協議)
(1) UDP是一個非連線的協議,傳輸資料之前源端和終端不建立連線,當它想傳送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。在傳送端,UDP傳送資料的速度僅僅是受應用程式生成資料的速度、計算機的能力和傳輸頻寬的限制;在接收端,UDP把每個訊息段放在佇列中,應用程式每次從佇列中讀一個訊息段。
(2) 由於傳輸資料不建立連線,因此也就不需要維護連線狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的訊息。
(3) UDP資訊包的標題很短,只有8個位元組,相對於TCP的20個位元組資訊包的額外開銷很小。
(4) 吞吐量不受擁擠控制演算法的調節,只受應用軟體生成資料的速率、傳輸頻寬、源端和終端主機效能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態表(這裡面有許多引數)。
(6)UDP是面向報文的。傳送方的UDP對應用程式交下來的報文,在新增首部後就向下交付給IP層。既不拆分,也不合並,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。
複製程式碼

5、什麼時候用連結串列什麼時候用陣列。

從資料結構上來說,陣列比較適合做查詢,相對連結串列來說陣列的查詢效率高一些。連結串列的話因為他是指標指向下一個元素,在做插入一個元素或者刪除一個元素只要改變指標指向就行(陣列的話後面元素都要改)。複製程式碼

6、NSString為什麼要用copy關鍵字,如果用strong會有什麼問題?

使用strong關鍵字後創造出的物件和原物件的物件地址是一樣的,指向同一個物件,而使用copy關鍵字物件地址是不一樣的,是建立了一個新的物件。由此我們可以看到如果原物件的值有了改變使用copy關鍵字的就會跟隨改變因為地址是一樣的,而使用strong關鍵字的就不會跟隨改變,因為是新建立的物件,地址是不一樣的。複製程式碼

7、oc使用什麼機制來管理物件記憶體?

mrc 手動記憶體管理
arc自動引用計數
garbage collection(垃圾回收) 但是ios不支援垃圾回收,arc作為llvm3.0編譯器的一項特性,在ios5.0(xcode4.0)版本後推出。
arc的判斷規則是,物件沒有強指標指向物件,物件就會被釋放。
複製程式碼

8、為什麼IBOutlet修飾的View也是用weak關鍵字?

因為當我們將控制元件拖到storyboard上就相當於新建立了一個物件,而這個物件加到檢視控制器的View上的,View有一個subviews屬性,這個屬性是一個陣列,而我們加的控制元件就在這個陣列中,那麼實際上我們的控制元件物件是屬於View的,也就是說View對加到他上面的控制元件是強引用。當我們是用outlet屬性的時候,我們是在viewcpntroller裡面使用,而這個outlet屬性是由View強引用的,在viwecontroller裡面僅僅是對其使用,並沒有必要擁有它,所以是weak。複製程式碼

9、可變集合類和不可變集合類的copy和mutablecopy有什麼區別?如果集合是內容複製的話,集合裡面的內容也是內容複製嗎?

首先我們要明白一個概念,什麼是倩複製,單層深複製,完全複製(每一層都深複製)淺複製就是指標複製並沒有進行物件複製;

單層深複製就是我們常說的深層複製,我們這裡說的單層深複製是針對集合類說的(NSArry, NSDictionary,NSSet),單層深複製值得是隻複製了該集合類的最外層,裡面的元素沒有進行復制(即這兩個集合類的地址不一樣,但是兩個集合裡所儲存的元素的地址是一樣的);

完全複製指的是完全複製整個集合類,也就是說兩個集合類地址不一樣,裡面所儲存的元素地址也不一樣。

[immutableObject copy]//淺複製
[immutableObject mutableCopy]//深複製
[mutableObject copy]//深複製
[mutableObject mutableCopy]//深複製
NSArray*copyArray = [[NSArrayalloc] initWithArray:array copyItems:YES];// 完全複製
複製程式碼

10、如何令自己寫的物件具備拷貝功能?

需要實現NSCopying協議,如果自定義的物件分為可變版本和不可變版本,那麼就需要同時實現NSCopying和NSMUtableCopying協議。複製程式碼

11、屬性的預設關鍵字是什麼?

對於基本資料型別預設關鍵字是atomic,readwrite,assign
對於普通的oc物件是atomic,readwrite,strong。
複製程式碼

12、用熟悉的語言實現n的階乘。

//求階乘
int factorial(int n){    
    if (n == 0 || n == 1) return 1;        
    return n*factorial(n - 1);
} 
int main(){    
    int n;    
    int sum = 0;    
    for (int i = 1; i <= n; i++){  
        sum += factorial(i);    
    }    
    printf("結果為: %d\n", sum);    
    return 0;
}
複製程式碼

13、為什麼說Object-C是一門動態語言?

有三個名詞容易混淆:   
Dynamic Programming Language 動態語言或動態程式語言    
Dynamically Typed Language   動態型別語言    
Statically Typed Language    靜態型別語言         

(1)動態語言

動態語言,是指程式在執行時可以改變其結構:新的函式可以被引進,已有的函式可以被刪除等在結構上的變化。比如眾所周知的ECMAScript(JavaScript)便是一個動態語言。除此之外如Ruby、Python也屬於動態語言,而c、c++等語言則不屬於動態語言。

(2)動態型別語言

意思就是型別的檢查是在執行時做的。

(3)靜態型別語言

型別判斷是在執行前做的(如編譯階段),比如Java就是靜態型別語言,靜態型別語言為了達到多型會採取一些型別鑑別手段,如繼承、介面,而動態型別語言卻不需要,一般的動態語言都會採用dybamic typing,常出現在指令碼語言中。是不是動態型別語言和這門語言是不是型別安全的完全沒有聯絡。

(4)不同型別語言的優缺點

靜態型別語言的優點在於其結構非常規範,便於除錯,方便型別安全;缺點是為此要寫很多的型別相關程式碼,導致不便於閱讀、不清晰明瞭。動態型別語言的優點在於方便閱讀,不需要寫很多的型別相關的程式碼;缺點是不方便除錯,命名不規範時會造成讀不懂。

(5)Object-C的動態執行性

Object-C語言是C語言的子集,所以是靜態型別語言,但是其特性之一多型讓其擁有了動態性。oc的動態性讓程式可以在執行時判斷其該有的行為,而不是像c等靜態語言在編譯構建的時候就確定了下來。她的動態性主要體現在以下三個方面:
a、動態型別
b、動態繫結讓程式碼在執行時判斷呼叫什麼方法,而不是編譯時,和其他面嚮物件語言一樣,方法呼叫和程式碼並沒有在編譯時繫結到一起,而是在訊息傳送時才進行連線。執行時決定呼叫哪個方法。
c、動態載入讓程式在執行時新增程式碼模組和其他資源,使用者可以根據需要載入一些可執行程式碼和資源,而不是再啟動時就載入所有的元件。可執行程式碼中可以含有和程式執行時整合的新類。複製程式碼

掘金徵文活動的連結:juejin.im/post/59aa74…


相關文章