iOS面试题整理
2020-10-12 本文已影响0人
jonas_fate
1.MVC设计模式的优缺点
一、MVC原理
MVC是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。
1、模型(model),它是应用程序的主体部分,主要包括业务逻辑模块和数据模块。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性
2、视图(view) ,用户与之交互的界面
3、控制器(controller),接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用
二、MVC的优点
1、可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
2、视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
3、模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
4、潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
三、MVC的不足之处
1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。
2.iOS面向对象的三大特征
一,封装:隐藏内部实现,提供外部接口,可以看成是”包装”。也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象来操作,对不可信的进行隐藏。
好处:使用更简单变量更安全可以隐藏内部实现细节开发速度加快。
属性封装实例变量,方法封装具体实现代码,类封装属性和方法。子类可继承父类中的方法,还可重写父类方法。
二、继承:使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。一个类可以继承另一个类,被继承的类成为超类(superclass),继承的类是子类(childclass),可以直接拥有父类中所有非私有成员(相关实例变量)、方法。
三、多态:允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。
实现多态,有二种方式,覆盖,重载。
1)覆盖:是指子类重新定义父类的函数的做法。
2)重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
3.Property(nonatomatic, copy) NSMutableArray有什么问题
问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。copy后返回的是不可变对象(即 arr 是 NSArray 类型,NSArray 类型对象不能调用 NSMutableArray 类型对象的方法)
原因:是因为 copy 就是复制一个不可变 NSArray 的对象,不能对 NSArray 对象进行添加/修改。
4.属性中的copy
copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。
用途:
1. NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;
2. block 也经常使用 copy 关键字。
5.解释分类
分类、类别其实都是指的Category。在不改变原有类的前提下,动态地给这个类添加一些方法。
分类的优点:
声明私有方法
分解体积庞大的类文件
把Framework私有方法公开
模拟多继承(另外可以模拟多继承的还有protocol)。
1.我们不主动引入 Category 的头文件,Category 中的方法都会被添加进主类中。我们可以通过 - performSelector: 等方式对 Category 中的相应方法进行调用:
a)将 Category 和它的主类(或元类)注册到哈希表中;
b)如果主类(或元类)已实现,那么重建它的方法列表。
2.在这里分了两种情况进行处理:
a)Category 中的实例方法和属性被整合到主类中;
b)类方法则被整合到元类中
c)对协议的处理比较特殊,Category 中的协议被同时整合到了主类和元类中。
3.最终都是通过调用 staticvoid remethodizeClass(Class cls) 函数来重新整理类的数据的。
![截屏2020-10-09 上午10.30.40.png](https://img.haomeiwen.com/i1421908/b69e16456748748c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)