四道過濾菜鳥的面試題(我也來答一答?)


http://www.jianshu.com/p/fd5d193f3d36 問

http://www.jianshu.com/p/c687110e552c 答

 

4道過濾菜鳥的iOS面試題

1.struct和class的區別

2.介紹一下觀察者模式

3.在一個https連接的網站里,輸入賬號密碼點擊登錄后,到服務器返回這個請求前,中間經歷了什么

4.在一個app中間有一個button,在你手觸摸屏幕點擊后,到這個button收到點擊事件,中間發生了什么

 

說下吧。

第一個道題,個人覺得主要是值類型和引用類型的一個問題吧。

之前使用 OC 的時候,全部是對象,都是引用類型,一般很少使用結構體之類的數據結構。

但是在 swift 出來之后,越來越多的討論的是值類型和引用類型了。

因為使用值類型更加安全,對多線程編程更加容易。

在微博上還有人說到了一些底層的實現方式。

對於 OC 的一個實現討論的是比較多的,但是 swift 上的實現現在也有一些對應的討論。但是具體的實現方式,也都只能是一個

大致的猜測一些驗證。

 

第二個問題觀察者模式。

說到設計模式,

參考這篇文章: http://www.jasongj.com/design_pattern/summary/

設計模式是一個方便大家溝通,一個對現有問題的已有的成熟的解決方案。

觀察者模式需要解決的問題是什么:

一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知並被自動更新

故胤道長回答了這個設計模式需要解決的問題。

然后就是設計模式在 iOS 中的實現吧。

之前大家接觸的比較多的地方NSNotificationCenter和KVO,道長也說了下該怎么使用。

通知中心和 KVO 這兩種方式也都比較常見。

還有一個就是現在比較火的 RxSwift之類的響應式編程中,也有觀察者模式的實現。

實現對象的之間的綁定,通信。

 

第三個問題, https 網站訪問的問題。

記得是在大學的時候,有一個作業是考的是 http網站訪問的流程。

這個問題,實話說,每個人了解的層次不一樣。

我們來看看道長的回答

  • 前端會打包一個請求,包括url,端口啊,你的賬號密碼等等。賬號密碼登陸應該用的是Post方式。所以相關的用戶信息會被加載到body里面。這個請求應該包含三個方面:網絡地址,協議,資源路徑。
  • 一般會先請求DNS服務器。DNS服務器負責將你的網絡地址解析成IP地址,這個IP地址對應網上一台機器。這其中可能發生Hosts Hijack和ISP failure的問題。
  • 協議是獲取資源的方式HTTP,FTP,UDP,不同協議有不同的格式,有些是process-to-process的,有些是host-to-host的。
  • 你會和后台的端口之間建立一個socket連接,socket一般都是以file descriptor的方式解析請求。
  • 后台的web服務器會響應請求,數據返回到瀏覽器。假如路徑不對,會出現404的錯誤。
  • 一般訪問服務器之前可能會訪問一下proxy。這玩意是個代理,有時候當防火牆用,有時候當cache使。如果后台是reverse-proxy結構,那么實際上有多個web服務器藏在proxy之后按需處理請求,而你訪問的永遠是proxy,這樣可以解決過載問題。
  • 有時候訪問完web服務器后還要訪問一下file服務器,主要是請求數據庫里的一些信息。
  • 服務器將相應打包,直接或通過proxy(大多數時候)返回給你。
文/故胤道長(簡書作者)
原文鏈接:http://www.jianshu.com/p/c687110e552c
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。

理解的有一定程度了。

按下回車鍵,發生了什么?

1. 瀏覽的工作,完成 UI 輸入到網絡請求的封裝。

2. 首先進行的是域名解析。

當然域名解析的話,瀏覽器有可能是緩存了一些之前的域名解析的結果的。

從域名到IP 地址的轉換。其中還要考慮 IPv4和 IPv6的地址。

3. 網絡請求的協議,有 HTTP,UDP,TCP,當然了是否要深入到 OSI 七層協議模型?

http://blog.csdn.net/sprintfwater/article/details/8751453

OSIVSTCP.jpg

http://blog.sina.com.cn/s/blog_6b8629950101g0ou.html

可以從應用層次一直說到物理層。

我們做軟件開發的一般也就了解道網絡層次。

之前個人做個一個接入網,本地網的設計。(基站到運營商機房,到匯集機房段。)

但是如果是像在華為這類的設備廠商,無疑是要熟透到物理層次。熟透道比特流的形式。

從瀏覽發出請求,電腦,手機構造的 bit 流的IP 報文,到 IP 報文的已經發送,到 IP 報文在光纜,光纖中的傳輸,到信號的中繼,放大,恢復,復原,重發,

信號從 電腦,手機,到交換機,到鐵塔機房,到匯聚機房,到骨感機房,到IDC,到國際出口,一層一層的向上。

而且這寫完全是在數十,數百毫秒內完成的。

中間的各種代理,瀏覽器代理,路由器代理,小區交換機,IPv4,IPv6網絡的穿透,還有 VPN 代理,還有一些流量請求的監聽。

 

UI->網路請求->IP 報文->數據傳輸->IP 報文-->響應網絡請求。

本地瀏覽器代理和遠端服務器的之間通訊。

本地請求,服務器收到請求,進行數據庫查詢,數據庫維護,響應體構造,響應報文返回,本地主機收到報文,本地應用收到報文,瀏覽器進行響應體解析,最后進行 DOM 渲染呈現給用戶。

這之前需要建立 Socket 連接,TCP 也好,UDP 也好,還有其他形式的 

FTP、Telnet、SMTP、TFTP、HTTP、POP3、NNTP、IMAP4、HTTPS、SNMP、DNS、SMB、BOOTP

 

第四個問題:

4.在一個app中間有一個button,在你手觸摸屏幕點擊后,到這個button收到點擊事件,中間發生了什么

我記得有篇文章回答的比較深入,比較好、

這個問題的要點,iOS 上響應鏈機制 。說實話,我想的比較淺層次。深入的層次可以到 RunLoop

 

個人覺得一圖勝千言:

來自 YYKit 的作者郭耀源:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM