ios開發者談談技術面試那些坑

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

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

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

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

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

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

 

華麗的分割線    xcode

下面分享一些總結的面試題,但願能有幫助安全

一、viewWillAppear和viewDidLoad這兩個方法誰會先被調用。微信

viewDidLoad先被調用,一個是load加載一個是appear呈現。

二、代理和block的區別。網絡

block 和 delegate 均可以通知外面。block 更輕型,使用更簡單,可以直接訪問上下文,這樣類中不須要存儲臨時數據,使用 block 的代碼一般會在同一個地方,這樣讀代碼也連貫。delegate 更重一些,須要實現接口,它的方法分離開來,不少時候須要存儲一些臨時數據,另外相關的代碼會被分離到各處,沒有 block 好讀。

三、算是問題2的深刻,單例裏面的方法回調要用什麼方法。

須要用block,由於用代理的話,若是多個對象同時調用單例的方法,那麼只有最後一個對象可以獲得響應。

四、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層。既不拆分,也不合並,而是保留這些報文的邊界,所以,應用程序須要選擇合適的報文大小。

五、何時用鏈表何時用數組。

從數據結構上來講,數組比較適合作查詢,相對鏈表來講數組的查詢效率高一些。鏈表的話由於他是指針指向下一個元素,在作插入一個元素或者刪除一個元素只要改變指針指向就行(數組的話後面元素都要改)。

六、NSString爲何要用copy關鍵字,若是用strong會有什麼問題?

使用strong關鍵字後創造出的對象和原對象的對象地址是同樣的,指向同一個對象,而使用copy關鍵字對象地址是不同的,是建立了一個新的對象。由此咱們能夠看到若是原對象的值有了改變使用copy關鍵字的就會跟隨改變由於地址是同樣的,而使用strong關鍵字的就不會跟隨改變,由於是新建立的對象,地址是不同的。

七、oc使用什麼機制來管理對象內存?

mrc 手動內存管理
arc自動引用計數
garbage collection(垃圾回收) 可是ios不支持垃圾回收,arc做爲llvm3.0編譯器的一項特性,在ios5.0(xcode4.0)版本後推出。
arc的判斷規則是,對象沒有強指針指向對象,對象就會被釋放。

八、爲何IBOutlet修飾的View也是用weak關鍵字?

由於當咱們將控件拖到storyboard上就至關於新建立了一個對象,而這個對象加到視圖控制器的View上的,View有一個subviews屬性,這個屬性是一個數組,而咱們加的控件就在這個數組中,那麼實際上咱們的控件對象是屬於View的,也就是說View對加到他上面的控件是強引用。當咱們是用outlet屬性的時候,咱們是在viewcpntroller裏面使用,而這個outlet屬性是由View強引用的,在viwecontroller裏面僅僅是對其使用,並無必要擁有它,因此是weak。

九、可變集合類和不可變集合類的copy和mutablecopy有什麼區別?若是集合是內容複製的話,集合裏面的內容也是內容複製嗎?

首先咱們要明白一個概念,什麼是倩複製,單層深複製,徹底複製(每一層都深複製)淺複製就是指針複製並無進行對象複製;

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

徹底複製指的是徹底複製整個集合類,也就是說兩個集合類地址不同,裏面所存儲的元素地址也不同。

[immutableObject copy]//淺複製
[immutableObject mutableCopy]//深複製
[mutableObject copy]//深複製
[mutableObject mutableCopy]//深複製
NSArray*copyArray = [[NSArrayalloc] initWithArray:array copyItems:YES];// 徹底複製

十、如何令本身寫的對象具有拷貝功能?

須要實現NSCopying協議,若是自定義的對象分爲可變版本和不可變版本,那麼就須要同時實現NSCopying和NSMUtableCopying協議。

十一、屬性的默認關鍵字是什麼?

對於基本數據類型默認關鍵字是atomic,readwrite,assign
對於普通的oc對象是atomic,readwrite,strong。

十二、用熟悉的語言實現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;
}

1三、爲何說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…

相關文章
相關標籤/搜索