总结一下iOS的一些面试经验
1.面向对象的思想?(OOA OOD OOP)
面向对象的思想:Object Oriented Analysis OOA 面向对象分析 、Object Oriented Design OOD 面向对象设计、Object Oriented Programming OOP 面向对象编程、Aspect Oriented Programming AOP 面向切面编程
1)面向对象分析:通过面向对象的风格来进行系统分析和需求定义的方法。认识对象及属性(标识对象);认识对象的整体与组成部分(标识结构);对象的形成及类的区分(标识主题);对空间问题理解并抽象成模型(定义属性,定义方法)
2)面向对象设计:在使用过程中遵循的面向对象的特征:封装、继承、多态
3)面向对象编程:把所有的对象都抽象模型化,对各种特性及行为方法进行抽象;对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。
4)面向切面编程:通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能,使调用者与被调用这之间解耦,提高代码的灵活性和可扩展性的一种技术(主要应用:日志记录,性能统计,安全控制,事务处理,异常处理等等)
总结:所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统
2.面向对象编程的特征与原则?
一、面向对象的特征:封装、继承、多态
1)封装:封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象
2)继承:子类自动共享父类之间数据和方法的机制。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类),但是在OC不支持多重继承。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。优点:继承不仅支持系统的可重用性,而且还促进系统的可扩充性;缺点:牵一发而动全身,修改代价比较大。
3)多态:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性,主要实现受类的继承特性支持,可以通过重写父类方法实现。
二、面向对象的基本原则(SOLID):单一职责原则(Single Responsibility Principle SRP)、开闭原则(Open Close Principle OCP)、里式替换原则(Liskov Substitution Principle LSP)、接口隔离原则(Interface Segregation Principle ISP)、依赖倒置原则(Dependence Inversion Principle DIP)
1)单一职责原则:指一个类或者模块应该有且只有一个改变的原因。重点在职责,主要是约束类
2)开闭原则:对象对于扩展是开放的,对于修改是关闭的。梅耶开闭原则指新建的类可以通过继承的方式来重用原类的代码,衍生的子类可以或不可以拥有和原类相同的接口;多态开闭原则指接口规约可以通过继承来重用,但是实现不必重用。已存在的接口对于修改是封闭的,并且新的实现必须至少实现那个接口(保持稳定性,扩展性)。
3)里式替换原则:任何基类可以出现的地方,子类一定可以出现。只有当子类可以替换掉基类,而功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏替换原则是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
4)接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上,多个专门的接口比使用单一的总接口要好
5)依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合
6)迪米特法则(Law Of Demeter LOD):最少知道原则,一个类应尽量少的与其他类发生依赖;通常使用中介者模式,减少模块间的依赖(组件化,模块化)
7)组合/聚合复用原则(Composite Reuse Principle, CRP): 一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的,降低耦合性。
参考相关链接:https://blog.csdn.net/qq_34760445/article/details/82931002#_78
3.说一下你对MVC 、MVP、MVVM?
1)MVC 经典的设计模式 M 指数据层,负责数据的组织与传递 V指展示层,用户看到的界面 C指就是Model 与 View 层之间的中介者,view层操作通过Controller 更新数据,model更新完成通过Controller 对view层数据进行更新。view层与model层之间是隔离的,可以保证view和model的可测试性与复用性。但是在iOS中viewController与View层视图展示与生命周期控制紧密结合,就造成业务逻辑与展示逻辑全部堆积到controller中,造成代码臃肿以及逻辑可测试性差;复杂界面虽然可以进行更新粒度的拆分,但是同样造成不易测试与维护。
2)MVP 在MVC基础之上把Controller中的业务逻辑进行抽离放到Presenter中
参考链接:https://www.jianshu.com/p/2ad25e2769b5
4.说一下对通知、代理、单例、Block设计模式的理解?
5.说一下对KVC、KVO的理解与实现过程应用场景等?
6.说一下对内存管理机制的理解?
7.说一下对Blcok的理解(原理、循环引用、)?
8.说一下对于多线程应用及理解(GCD,NSOperation,NSThread)
9.说一下响应者链、消息转发、反射机制的理解?
10.说一下对Runtime 、Runloop 的理解及应用,有看过源码吗?
11.说一下平时都怎样对应用进行性能优化、启动耗时、性能检测等?
12.说一下对组件化的理解与认识?
13.说一下对TCP/UDP/Socket的理解?
14.说一下对数据结构与算法的认识?
15.说一下对于开发中遇到崩溃、闪退的处理?
16.说一下swift、React-Native、Weex、Vue、Javascript、热更新的应用?
17.说一下常用的第三方库的实现原理(SDWebimage、Masonry、YYKit等)?
18.iOS中常用的几种锁及应用场景?
19.说一下原声代码与H5之间的调用理解?
20.说一下对于数据存储的理解(plist、userDefault、对象序列化、sqlite、coreData等)?
21.说一下对于HTTPS的原理及与Http区别?
22.说一下你对数据安全的理解及应用?(网络请求,应用程序包,下载文件资源安全等)
23.说一下viewController的生命周期?
controller的声明周期:loadView、viewDidLoad、viewWillAppear、viewWillLayoutSubviews、viewDidLayoutSubviews、viewDidAppear、viewWillDisappear、viewDidDisappear、dealloc构成了controller的声明周期。alloc、new之后如果有调用self.view设置属性则调用立刻调用loadView、viewDidLoad,push/present的时候调用viewWillAppear、viewWillLayoutSubviews、viewDidLayoutSubviews对视图进行布局;如果没有则统一在push/present时调用,布局完成的时候viewDidAppear展示界面,界面消失的viewWillDisappear、viewDidDisappear,完全消失后调用dealloc释放界面的内存。
网友评论