面试iOS面试笔试题

iOS面试题<一>

2016-07-02  本文已影响184人  离离离离
1.iOS和iPhone做了哪些设计来降低功耗、延长续航时间?作为应用的开发者,又如何避免费电?
答:iOS和iPhone对续航时间做的设计:推送、伪后台

iOS的省电机制主要有以下几种:
强化的后台机制
1.墓碑式:伪多任务,应用推至后台后,虽然没有被关闭,但是所有活动都被冻结,只能通过苹果服务器转发的推送来与用户交互
2.智能调度后台:在一些指定类别的APP,比如社交、新闻类的应用中,iOS系统会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台数据获取频率和启动时长,开发者自己不能设置数据具体什么时候更新
3.真后台:苹果也提供一些有诸多限制的接口来保证真后台,只供特定应用行为调用,比如后台音频,定位,上传下载等。
作为开发者如何省电:

首先当然优化代码,积极合理地使用runloop,多线程等技术。
其次是尽量少地调用一些费电的接口,比如频繁的定位,频繁的后台更新数据,如无必要,尽量不用。
2.TCP为什么要设计三次握手?如果要解决三次握手来的延迟问题而去掉三次握手,如何解决三次握手所解决的问题?
答:TCP三次握手:(建立连接)
1.第一次握手:建立连接时,客户端发送消息到服务器,并进入消息发送状态,等待服务器确认;
2.第二次握手:服务器收到消息,必须确认客户的发送过来的消息,同时自己也发送消息反馈给客户,此时服务器 进入消息待接收状态
3.第三次握手:客户端收到服务器的反馈消息,向服务器发送确认消息反馈,此消息发送完毕,客户端和服务器进入等待状态,完成三次握手。

为什么要设计三次握手呢?
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
简单来说:TCP的三次连接是双工的,为了保证双工,必需保证服务器端和客户端都能进行发送和接收信息,实际是为了让双方的请求都能识别的到,所以逻辑上至少执行三次。
3.C语言的函数调用编译成汇编代码是怎样的?可用X86或ARM汇编代码回答。
 http://www.cnblogs.com/mqmelon/p/4763913.html
4.block对外层函数的local变量的引用是如何工作的?
1.在MRC环境下,__block根本不会对指针所指向的对象执行copy操作,而只是把指针进行的复制
2.在ARC环境下,对于声明为__block的外部对象,在block内部会进行retain,以至于在block环境内能安全的引用外部对象,所以要谨防循环引用的问题
5.编译器如何实现weak的?
weak 属性特点:weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同 assign 类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。

那么 runtime 如何实现 weak 变量的自动置nil?
runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc,假如 weak 指向的对象内存地址是a,那么就会以a为键, 在这个 weak 表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil。
6.LLVM和GCC有哪些不同?可从多个角度来说。
含义解释:
LLVM:LLVM最初是[Low Level Virtual Machine](http://en.wikipedia.org/wiki/Llvm)的缩写,定位是一个虚拟机,但是是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。

就现在来看,gcc大体等同于llvm+clang所提供的功能。很多人特别羡慕clang那强大的错误诊断信息,其实gcc4.8部分信息诊断能力已经超过它了。

不同点:
1.所需要的寄存器不同:
llvm-gcc值用到了eax这一个寄存器,而gcc用到了eax, edx两个寄存器
2.编写的语言的不同
llvm-gcc:llvm默认的前端是clang,当然也可以用gcc做前端。llvm用c++写的,模块化做的很好,因此可以很好的和clang,gcc等等更多的东西合作,能为ide提供更全的有用信息。
gcc则包含的比较全面,整一个是一个宏结构,没有模块化设计,用c写的,对ide也不太友好(实际上linux社区里似乎对ide一直不感冒)。不过c++版的gcc正在重写中,为了与llvm/clang更好的竞争,而且gcc从5.0开始打算进行模块化设计,所以,以后gcc内部可能会分出很多部分。
3.内存和性能
freebsd不用gcc是因为gpl协议,llvm/clang的协议更加自由,但llvm/clang目前的兼容性和参数优化等等方面和gcc还有不小差距,虽然编译后的体积更小了(架构领先优势),但在性能优化方面相比gcc还有很多事情要
4.缺点
gcc目前的问题就是缺乏模块化设计,这是暂时落后于llvm的地方
7.设计第三方分享模块(即分享到微博,微信,QQ等),简述主要的类,要求对第三方库做较好的封装。
1.友盟
2.shareSDk :http://www.jianshu.com/p/e374732f54f0
8.iOS/SDK存在或曾经存在的bug
http://blog.csdn.net/andypan1314/article/details/8797216
9.微信是如何检测用户把手机放到耳朵旁边的
使用近距离传感器
[UIDevice](https://developer.apple.com/library/ios/#documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html) 中有两个近距离传感器的属性:proximityMonitoringEnabled 和 proximityState。这两个属性都是 iOS 3.0 及以上才支持的。

proximityMonitoringEnabled 属性
要确定近距离传感器是否可用,可以尝试启用它,即 proximityMonitoringEnabled = YES,如果设置的属性值仍然为NO,说明传感器不可用。
proximityState 属性
传感器已启动前提条件下,如果用户接近 近距离传感器,此时属性值为YES,并且屏幕已关闭(非休眠)。And vice versa。

代码:http://www.cnblogs.com/daguo/p/3567791.html
10.假如最近收到很多用户反馈说应用很慢或者打不开,如何着手分析和解决这个问题?
慢的原因:用户的电脑、手机的运行环境、内存大小、系统甚至程序间的兼容问题可能让应用“慢”下来;国内复杂的网络环境和参差不齐的上网方式会拖累应用查询的响应速度;至于服务器、数据库更是运维人员照顾的重点。此外还有代码,一条有问题的语句,可能会损耗掉应用数百毫秒响应时间。

1.优化简化代码
2.关掉不必要的推送
3.减少耗损程序的代码:比如过多的动画效果等
11.简述方案,搭建一个自动化构建系统,如果可能,一同搭建一个自动化测试系统。
其实我也看不懂,放链接你们自己去看吧~
http://www.jianshu.com/p/53b17f2c275e

版权归属于离离离离。
版权所有,翻版必究,如若转载,请注明出处。谢谢 ~

上一篇下一篇

猜你喜欢

热点阅读