前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。
目录:
iOS-面试题-OC基础篇 (1) - (84)
iOS-面试题-OC基础篇 (2) - (83)
iOS-面试题-OC基础篇 (3) - (1)
1. 设计模式?
设计模式:MVC 模式、单例模式、观察者模式、MVVM 模式、工厂模式、代理模式、策略模式、 适配器模式、模板模式、外观模式、创建模式
参考:http://blog.jobbole.com/20496/ 有23中设计模式1.mvc 模式:model 保存应用模型和处理数据逻辑、view 负责 model 数据和交互控件的显示、 controller 负责 model 和 View 之间的通讯
2.单例模式:用一个静态方法返回这个类的对象。这个对象是全局唯一的。整个项目里面只开 辟一块内层,比如登录之后获取的用户数据存储、NSNotificationcenter、NSUserdefaults, sharedApplication。
缺点:这块内层直到项目推出时才能释放。 优势:使用简单,延时求值,易于跨模块, 便于资源共享控制,方便传值和修改单例的属性 敏捷原则:单一职责原则
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。oc中,重写 allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,返回的也只是此单例 类的唯一静态变量。
3.观察者模式:通过添加观察者来观察某个对象的实例变量的变化、当该被观察的对象发生时, 发出通知,通知观察者。如常用的导航栏渐变。
应用场景:一般为 model 层对 controller 和 view 进行的通知方式,不关心谁去接收,只负责发布信息。
优势:解耦合 敏捷原则:接口隔 离原则,开放-封闭原则 实例:通知中心,注册通知中心,任何位置可以发送消息,注册观察 者的对象可以接收。
4.工厂模式:快速创建对象的方式。将对象的创建和属性赋值封装成类方法,如:创建常用按 钮、textFeild 等,forState 这些枚举值不用反复写,可以使调用工厂方法的地方代码更加简 洁。
应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关 系。 敏捷原则:DIP依赖倒置原则
实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换 注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也 很明显,增加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥 用。
- 代理模式:代理模式给某一个对象供一个代理对象,并由代理对象控制对源对象的引用。
如招人干活,干完告诉我。常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到 广泛应用。有点像c++中多继承。增加对象的方法和属性。代理模式使项目的逻辑结构比较直观, 比如tableView的delegate和DataSource。
优势:解耦合 敏捷原则:开放-封闭原则。
代理的目 的是改变或传递控制链,允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的 指针,可以减少框架复杂度和耦合度。另外一点,代理可以理解为java中的回调监听机制的一 种类似。
- 策略模式:把一些独立的算法单独封装起来,如我以前有个车管的app里面根据北斗定位步标设备最后一次上传数据库的时间和车辆状态,来解析车辆当前的状态,数据库中的 16 进制的状 态(应用的是交通部的 808 协议),移动端获得将此状态字段转换成 2 进制,判断出车辆的 24 中状态。cell 多种响应效果
应用场景:定义算法族,封装起来,使他们之间可以相互替换。优势:使算法的变化独立于使 用算法的用户
敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。
实例:排序算法,NSArray的sortedArrayUsingSelector
适配器模式:根据不同的场景选择不同的对象,不如接手了一个旧代码,一进公司就得修改需 求,这时候的代码逻辑没法去反复理解,如我的一个老项目里面有一个认证功能将货主认证的 model 和车主认证 model 放同一个 model 里面,现在需要增加货主认证 model 属性修改,此时 就可以使用适配器了,原来其他地方还是走货住认证,因为企业也是货主的一种,可以建一个 新的货主 model 新需求走新的货主认证。
模板模式:比如现在的项目建的基类baseViewController,baseTableViewController,
外观模式:专门为外部供子类模块功能的 api 类,如果保险下单,只需要支付用你选的支付 方式和保险种类及填写的保险的必要信息一起传给下单的外观对象即可,在外观类里面封装了 有下单和支付两个子步簇,只需要将下保险的是否成功的结果返给下单界面就行。
创建模式:将一个复杂对象的构建与它表示分离。使得同样的构建过程可以创建不同的表示,假如在一个工具对象内对轨迹点去重复、纠偏、漂移过滤,例如一个对象对外提供该时间段轨迹停车时长和平均速度、平局耗油量等参数的接口。 拿到数组点在地图上展示一下就可以了,此数组对象的生成和使用可以分开。当然了这些复杂的操作都在服务端做了。
12.MVP 模式从经典的 MVC 模式演变而来,将 Controller 替换成 Presenter,依据 MVP 百度百科中 的解释,MVP 的优点相比较于 MVC 是完全分离 Model 与 View,Model 与 View 的信息传递只能通 过 Controller/Presenter,我查阅资料发现在其他平台上的 MVC 模式 View 与 Model 能否直接 通讯有着不同的说法,但在 iOS 开发中,Apple 是这么说的。在 MVC 下,所有的对象被归类为 一个 model,一个 view,或一个 controller。Model 持有数据,View 显示与用户交互的界面, 而 View Controller 调解 Model 和 View 之间的交互,在 iOS 开发中我按照 Model 与 View 无法 相互通讯来理解。
- MVVM(看第2道)