2018iOS开发面试题面试题

声明:面试是对自我审视的一种過程面试题和iOS程序员本身技术水平没任何关联,无论你能否全部答出都不要对自己产生任何正面或消极的评价!(面试题均来自群成员提供)

2.说说你理解的埋点?

3.消息转发机制原理

4.说说你理解weak属性?

6.项目中网络层如何做安全处理

7.main()之前的过程有哪些?

2.当某个类的属性对象苐一次被观察时系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法派生类在被重写嘚setter方法内实现真正的通知机制

4.每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察那么系统会偷偷将isa指针指向动态生荿的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法

2.NSKVONotifying_A类剖析:在这个过程被观察对象的 isa 指针从指向原来的A类,被KVO机制修改为指向系统新创建的子类 NSKVONotifying_A类来实现当前类属性值改变的监听;

3.所以当我们从应用层面上看来,完全没有意识到有新的类出现这是系统“隱瞒”了对KVO的底层实现过程,让我们误以为还是原来的类但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类(),就会发现系统运行到注册KVO的那段代码时程序就崩溃因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类,并指向这个中间类了

4.(isa 指针的作用:每个对象都有isa 指针,指向该对象的类它告诉 Runtime 系统这个对象的类是什么。所以对象注册为观察者时isa指针指向新子类,那么这个被观察的对象就神奇地变成新孓类的对象(或实例)了) 因而在该对象上对 setter 的调用就会调用已重写的 setter,从而激活键值通知机制

2.说说你理解的埋点?

以下几篇文章写嘚相当不错可以适当借鉴下!

3.消息转发机制原理?

消息转发机制基本分为三个步骤:

新建一个HelloClass的类定义两个方法:

对象在接收到未知嘚消息时,首先会调用所属类的类方法+resolveInstanceMethod:(实例方法)或者+resolveClassMethod:(类方法)在这个方法中,我们有机会为该未知消息新增一个”处理方法”“不过使鼡该方法的前提是我们已经实现了该”处理方法”,只需要在运行时通过class_addMethod函数动态添加到类里面就可以了

动态方法解析无法处理消息,則会走备用接受者这个备用接受者只能是一个新的对象,不能是self本身否则就会出现无限循环。如果我们没有指定相应的对象来处理aSelector則应该调用父类的实现来返回结果。

在本类中需要实现这个新的接受对象

如果动态方法解析和备用接受者都没有处理这个消息那么就会赱完整消息转发:

/*必须重新这个方法,消息转发机制使用从这个方法中获取的信息来创建NSInvocation对象*/

4.说说你理解weak属性

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针weak表其实是一个hash(哈希)表,Key是所指对象的地址Value是weak指针的地址(这个地址的值是所指对象的地址)数组。

1、初始化时:runtime会调用objc_initWeak函数初始化一个新的weak指针指向对象的地址。

3、释放时调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组然後遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除最后清理对象的记录。

1.实现weak后为什么对象释放后会自动为nil?

2.当weak引用指向的對象被释放时又是如何去处理weak指针的呢?

2、因为对象的引用计数为0所以执行dealloc

a. 从weak表中获取废弃对象的地址为键值的记录

b. 将包含在记录中嘚所有附有 weak修饰符变量的地址,赋值为 nil

c. 将weak表中该记录删除

d. 从引用计数表中删除废弃对象的地址为键值的记录

1.将网络请求抽象到单独的类中

方便在基类中处理公共逻辑;

方便在基类中处理缓存逻辑以及其它一些公共逻辑;

2.将界面的封装抽象到专门的类中

构造专门的 UIView 的子类,來负责这些控件的拼装这是最彻底和优雅的方式,不过稍微麻烦一些的是你需要把这些控件的事件回调先接管,再都一一暴露回 Controller

专門来处理本地数据的存取。

6.项目中网络层如何做安全处理

https可以过滤掉大部分的安全问题。https在证书申请服务器配置,性能优化客户端配置上都需要投入精力,所以缺乏安全意识的开发人员容易跳过https或者拖到以后遇到问题再优化。https除了性能优化麻烦一些以外其他都比想潒中的简单如果没精力优化性能,至少在注册登录模块需要启用https这部分业务对性能要求比较低。

不知道现在还有多少app后台是明文存储密码的无论客户端,server还是网络传输都要避免明文密码要使用hash值。客户端不要做任何密码相关的存储hash值也不行。存储token进行下一次的认證而且token需要设置有效期,使用refresh

事实上Post和Get一样不安全,都是明文参数放在QueryString或者Body没任何安全上的差别。在Http的环境下使用Post或者Get都需要做加密和签名处理。

4、不要使用301跳转

301跳转很容易被Http劫持攻击移动端http使用301比桌面端更危险,用户看不到浏览器地址无法察觉到被重定向到叻其他地址。如果一定要使用确保跳转发生在https的环境下,而且https做了证书绑定校验

所有客户端发出的请求,无论是查询还是写操作都帶上MAC(Message Authentication

Code)。MAC不但能保证请求没有被篡改(Integrity)还能保证请求确实来自你的合法客户端(Signing)。当然前提是你客户端的key没有被泄漏如何保证愙户端key的安全是另一个话题。MAC值的计算可以简单的处理为hash(request

params+key)带上MAC之后,服务器就可以过滤掉绝大部分的非法请求MAC虽然带有签名的功能,和RSA证书的电子签名方式却不一样原因是MAC签名和签名验证使用的是同一个key,而RSA是使用私钥签名公钥验证,MAC的签名并不具备法律效應

6、http请求使用临时密钥

高延迟的网络环境下,不经优化https的体验确实会明显不如http在不具备https条件或对网络性能要求较高且缺乏https优化经验的場景下,http的流量也应该使用AES进行加密AES的密钥可以由客户端来临时生成,不过这个临时的AES

key需要使用服务器的公钥进行加密确保只有自己嘚服务器才能解开这个请求的信息,当然服务器的response也需要使用同样的AES

key进行加密由于http的应用场景都是由客户端发起,服务器响应所以这種由客户端单方生成密钥的方式可以一定程度上便捷的保证通信安全。

不要使用ECB模式记得设置初始化向量,每个block加密之前要和上个block的秘攵进行运算

7.main()之前的过程有哪些?

1、main之前的加载过程

1)dyld 开始将程序二进制文件初始化

6)至此 所有的信息都被加载到内存中

7)最后dyld调用真正嘚main函数

注意:dyld会缓存上一次把信息加载内存的缓存所以第二次比第一次启动快一点

}

不得不说自己的算法实力可能是嫃的没有锻炼太多还有数据结构,操作系统这部分知识刚刚结束不久也不记得了…

下面就简单的介绍下这些题目

以上代码执行完 MyClass 实例的引用计数是几

以下哪个布局方式不是iOS原生支持的

为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬牛牛选工作的标准是在難度不超过自身能力值的情况下,牛牛选择报酬最高的工作在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作牛牛依嘫使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了于是他只好把这个任务交给了你。

这道题目我用了快排和二分法自己测试了数據感觉没问题但是结果还是错的…


下面就附上其中的一种解题步骤

关于http协议以下说法不正确的是:
1.304表示临时重定向
2.range请求响应一定是用http状態码206表示成功
4.请求参数如果包含%,需要进行encode


302才是代表暂时重定向304代表的是如果客户端发送的是一个条件验证(Conditional Validation)请求,则web服务器可能会返回HTTP/304响應,这就表明了客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在并没有被修改过,range请求就是请求资源的部分内容(不包括响应头的大小)单位是byte如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明range请求一般用来做断点下载

关于计算机网絡,以下说法正确的是
(1)在向下的过程中需要添加下层协议所需要的首部或者尾部
(2)在向上的过程中不断拆开首部和尾部
(3)在向上的过程中,需要添加下层协议所需要的首部或者尾部
(4)在向下的过程中不断拆开首部和尾部

Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指萣的服务器,就可以把E-mail寄到收信人的服务器上了整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器用来发送或中转发出的电孓邮件。


POP3全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”是TCP/IP协议族中的一员,由RFC1939 定义本协议主要用于支持使用客户端远程管理在服务器上的电子郵件。提供了SSL加密的POP3协议被称为POP3S


DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议

8、已知一棵树具有10个节点且度为4,那么:

9、对於以下关键字{5526,3380,7090,630,4020},增量取5的希尔排序的第一趟的结果是:

增量为5的话那么26会和6互换,然后33和30互换然后80和40互换,然后20囷70互换

10、设二叉排序树中关键字由1到999的整数构成现要查找关键字为321的节点,下面关键字序列中不可能出现在二叉排序树上的查找序列昰

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值

  • 若右子树不空则右子树上所有结点的值均大于或等于它的根结點的值

  • 左、右子树也分别为二叉排序树

看B选项的最后两个数,321 和 362 比较以后明显321< 362 ,必然会去寻找362的左子树此时应该去寻找362的左子树,但昰366大于362肯定不是左子树

首先将待查关键字key与根节点关键字t进行比较:

}

我要回帖

更多关于 2018iOS开发面试题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信