这几天不断地面试,每个面试官问的问题各不相同,问的天花乱坠,把我弄得晕头乱想,所以把面试经验整理一下,方便自己阅读和复习。
实际上还是自己的基础不过关,只是知道写一味地写,并不知道其中的内涵,希望各位以此为鉴。
1、C语言和Object-C之间的区别?
C语言是面向过程
Object-C语言是面向对象的
2、面向对象和面向过程的区别以及优缺点?
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
3、StoreBoard、XIB、纯代码三者之间的优缺点?
一、手写代码UI
1、优势
√适合大型项目大规模使用,利于版本管理、追踪改动以及代码合并
√最好的代码重用性
2、遗憾
√慢,开发周期长,维护代码复杂
√自动布局AutoLayout困难
二、xib文件组织viewController或者view
1、优势
√开发速度快
√在版本管理上和纯代码的差异并不是很大,易读易维护
2、遗憾
√ xib中的设置往往并非最终设置,UI设计会被代码所覆盖
(如果选择xib,那么要尽量将xib的工作和代码的工作隔离开来:能够使用xib完成的内容就统一使用xib来做,而不要说三个Label其中两个在xib设置了字体而另一个却在代码中完成。尽量仅保持必要的、较少的IBOutlet和IBAction会是一个好方法。)
三、storyBoard
1、优势
√可以看到每个ViewController的布局样式,也可以明确地知道各个ViewController之间的转换关系
√代码量少,开发周期短
√关键是已经成为新建项目时候的默认配置,代表着苹果以后的方向和重心
2、遗憾
√很难多人协作
√ ViewController的重用和自定义的view的处理
以上答案是某位大神简单的介绍,我也说说自己的看法:
纯代码适合项目规模大逻辑较为复杂的页面,可以封装,重构,复用等特点,利于我们管理也可以版本控制,例如实现动画,复杂的逻辑页面的处理必须的用代码来实现,用xib或者storeboard无法实现,还的用代码来实现,还的托各种的线,是代码多,复用底,不利于管理等。
纯代码 的缺点:开发周期长,布局困难,不过现在有masonry自动布局和苹果自带的AutoLayout使我们开发起来简单方便的多了。
4、你知道哪些设计模式?他们的优缺点和区别?
设计模式:MVC,代理,单例、委托、通知、KVO、KVC等
MVC:
01.Model
Model代表了描述业务路逻辑,业务模型、数据操作、数据模型的一系列类的集合。这层也定义了数据修改和操作的业务规则。
02.View
View代表了UI组件,像CSS,JQuery,html等。他只负责展示从controller接收到的数据。也就是把model转化成UI。
03.Controller
Controll负责处理流入的请求。它通过View来接受用户的输入,之后利用Model来处理用户的数据,最后把结果返回给View。Controll就是View和Model之间的一个协调者。
代理:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。