http://www.jianshu.com/p/fd5d193f3d36 问
http://www.jianshu.com/p/c687110e552c 答
4道过滤菜鸟的iOS面试题
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
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 的作者郭耀源: