iOS开发

iOS面试

2016-09-27  本文已影响83人  指尖猿

常用的设计模式

•单例模式

•组合模式

•观察者模式

•代理模式

•享元模式

•工厂方法模式

•抽象工厂模式

#MVC的理解

•数据管理者(M)、数据展示者(V)、数据加工者(C)

• M应该做的事:

○给ViewController提供数据

○给ViewController存储数据提供接口

○提供经过抽象的业务基本组件,供Controller调度

• C应该做的事:

○管理View

Container的生命周期

○负责生成所有的View实例,并放入View

Container

○监听来自View与业务有关的事件,通过与Model的合作,来完成对应事件的业务。

• V应该做的事:

○响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在View去做)等。

○界面元素表达

#MVC和MVVM的区别

• MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中处理

• MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进

•补充:常见的设计模式有:MVC、MVCS、MVVM、viper

#TCP和UDP有什么区别?

• TCP是面向连接的,建立连接需要经历三次握手,保证数据正确性和数据顺序

• UDP是非连接的协议,传送数据受生成速度,传输带宽等限制,可能造成丢包

• UDP一台服务端可以同时向多个客户端传输信息

• TCP报头体积更大,对系统资源要求更多

#TCP的三次握手

•第一次握手:客户端发送syn包到服务器,并进入syn_send状态,等待服务器进行确认;

•第二次握手:服务器收到客户端的syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN + ACK包,此时服务器进入SYN_RECV状态;

•第三次握手:客户收到服务器发送的SYN+ACK包之后,向服务器发送确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成第三次握手。

#如何制作一个静态库/动态库?他们的区别是什么?

• Xcode6支持制作静态库/动态库framework

•无论是动态库还是静态库都是区分真机和模拟器的

•静态库编译静态库文件装入程序空间,动态库是文件动态装入内存

•动态库执行到相关函数才会被调用,节省空间

•苹果一般不允许第三方动态库,APP容易被拒

-一个lib包含了很多的架构,会打到最后的包里么?

•不会,如果lib中有armv7,

armv7s, arm64, i386,x86_64架构,而target architecture选择了armv7s,arm64,那么只会从lib中link指定的这两个架构的二进制代码,其他架构下的代码不会link到最终可执行文件中;反过来,一个lib需要在模拟器环境中正常link,也得包含i386架构的指令

每一个设备都有属于自己的CPU架构

每一个静态支持的架构是固定

模拟器

4s-->5 : i386

5s-->6plus : x86_64

真机

3gs-->4s : armv7

5/5c :

armv7s,静态库只要支持了armv7,就可以跑在armv7s的架构上

5s-->6plus : arm64

#常用命令总结:

//使用lipo -info命令,查看指定库支持的架构,比如UIKit框架

lipo -info

UIKit.framework/UIKit

//想看的更详细的信息可以使用lipo -detailed_info

lipo -detailed_info

UIKit.framework/UIKit

//还可以使用file命令

file

UIKit.framework/UIKit

//合并MyLib-32.a和MyLib-64.a,可以使用lipo -create命令合并

lipo -create

MyLib-32.a MyLib-64.a -output MyLib.a

#支持64-bit后程序包会变大么?

•会,支持64-bit后,多了一个arm64架构,理论上每个架构一套指令,但相比原来会大多少还不好说

用过Core Data或者SQLite吗?读写是分线程的吗?遇到过死锁没?如何解决的?

•用过SQLite,使用FMDB框架

•丢给FMDatabaseQueue或者 添加互斥锁(NSLock/@synchronized(锁对象))

请简单的介绍下APNS发送系统消息的机制

• APNS优势:杜绝了类似安卓那种为了接受通知不停在后台唤醒程序保持长连接的行为,由iOS系统和APNS进行长连接替代

• APNS的原理:

○应用在通知中心注册,由iOS系统向APNS请求返回设备令牌(device Token)

○应用程序接收到设备令牌并发送给自己的后台服务器

○服务器把要推送的内容和设备发送给APNS

○ APNS根据设备令牌找到设备,再由iOS根据APPID把推送内容展示

不用中间变量,用两种方法交换A和B的值

•方法1:

A = A + B

B = A - B

A = A - B

•方法2:异或

A = A^B;

B = A^B;

A = A^B;

#开发常用的工具有哪些?

Xcode

你一般是怎么用Instruments的?

用于调试内存泄露,循环引用

#你一般是如何调试Bug的?

一般情况,逻辑判断,其次看堆栈,断点调试 ,lldb

#如何实现单例,单例会有什么弊端?

单例是一种开发思想. 实现单利重写构造方法即可 ,对象会一直存在知道程序结束才销毁

弊端?单例不可滥用 ,滥用单例会让内存庞大.

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

•节省内存资源,一个应用就一个对象

节省内存资源?牺牲时间换空间  

APP上架后如何搜集错误信息?

用qq旗下的bugly当然友盟也有 只需要在app注册即可

简答描述下你所理解的敏捷开发

敏捷开发 

六大设计原则:

代理:解耦和, 开放封闭原则

观察者模式:接口隔离原则,开放-封闭原则

MVC 对扩展开放-对修改封闭

单例 单一职责原则

策略模式 :敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。

(六)工厂模式 易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。 倒转依赖原则 

上一篇 下一篇

猜你喜欢

热点阅读