【面试】iOS 开发面试题(四)
2016-07-24 17:34
423 查看
1、面向对象编程三大特性:封装、继承、多态
封装:就是不允许外界直接访问成员属性,提供set和get方法给外界,用于设置和获取属性的值。我们可以在set方法里面对参数进行过滤,防止外界的恶意改动。
继承:如果两个类有相同的属性和行为,可以抽取出来组成一个新的类,这个新的类就是前面两个类的父类。子类如果继承了父类,就会有父类所有的属性和方法。子类是对父类的一个扩充。
多态:多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。在使用多态是,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。
2、iOS总结静变量static、全局变量extern、局部变量
1、静态变量 static
什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用static。
静态变量的优点:1、节省内存。静态变量只存储一处,但供所有对象使用。
2、它的值是可以更新的。
3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
2、全局变量extern
什么是全局变量:也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。
作用域是整个源程序。
如果全局便利和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全
局变量。
3、局部变量
什么是局部变量:是在方法内作定义说明的。其作用域仅限于方法内。
3、iOS开发Delegate,Notification,Block使用
1.Delegate(代理、委托)
优点:
1.减少代码的耦合性,使事件监听和事件处理相分离。
2.清晰的语法定义,减少维护成本,较强的代码可读性。
3.不需要创建第三方来监听事件和传输数据。
4.一个控制器可以实现多个代理,满足自定义开发需求,可选必选有较大的灵活性。
缺点:
1.实现委托的代码过程比较繁琐。
2.当实现跨层传值监听的时候将加大代码的耦合性,并且程序的层次结构将变的混乱。
3.当对多个对象同时传值响应的时候,委托的易用性将大大降低。
2.NotificationCenter(通知)
优点:
1.使用简单,代码精简。
2.解决了同时向多个对象监听相应的问题。
3.传值方便快捷,Context自身携带相应的内容。
缺点:
1.使用完毕后,要时刻记得注销通知,否则将出现不可预见的crash。
2.key不够安全,编译器不会监测是否被通知中心正确处理。
3.调试的时候动作的跟踪将很难进行。
4.当使用者向通知中心发送通知的时候,并不能获得任何反馈信息。
5.需要一个第三方的对象来做监听者与被监听者的中介。
3.Block(代码块)
优点:
1.语法简洁,实现回调不需要显示的调用方法,代码更为紧凑。
2.增强代码的可读性和可维护性。
3.配合GCD优秀的解决多线程问题。
缺点:
1.Block中得代码将自动进行一次retain操作,容易造成内存泄露。
2.Block内默认引用为强引用,容易造成循环引用。
4.使用场景对比
1.回调方法
在日常的开发过程中,我们经常会遇到一些完成之后的处理问题,比如完成网路请求之后的回调,或者页面加载完成之后的回调等。这个时候我们一般使用的是前两者方法,即Block或者Delegate。而在一对一传输回
调的时候明显Block的使用更加的简单高效,只需要在代码块中执行所需要的操作即可。在一对多的情况下,Delegate更加能够发挥出自己的优势。
2.跨层通信
有的时候我们需要实现在两个毫无关联的对象之间的通信,这个时候如果使用Block或者Delegate就势必会增加代码的耦合性,这样对于代码的结构来说是不健康的,因此这个时候使用Notification便是明智的选择。
3.UI响应事件
用户在于App的UI进行互动的时候,总会需要App进行交互响应,这个时候就毫无疑问的使用代理设计模式。而苹果官方给出的建议也是可以肯定的,在Cocoa
Touch框架中我们也可以在几乎所有的UI交互控件的头文件里看到Delegate的成员变量,也正是印证了在UI响应事件上Delegate有着绝对的优势。
4.简单值得传递
当需要进行简单值得传递的时候,比如子控件传输给父控件所点击的IndexPath的时候,更加适合使用Block来传值。因为,如果只是为了传这一个简单的值而没有特别的业务处理而定义一个协议,然后实现协议,设置代理再写方法的话将十分麻烦,得不偿失,这个时候简单高效的Block就可以完美的替代Delegate完成任务了。
4、 @synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是 @synthesize,一个是@dynamic。如果
@synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;
@synthesize 的语义是如果你没有手动实现 setter方法和 getter方法,那么编译器会自动为你加上这两个方法。
@dynamic 告诉编译器:属性的 setter与 getter方法由用户自己实现,不自动生成。(当然对于
readonly的属性只需提供 getter即可)。假如一个属性被声明为 @dynamic var,然后你没有提供
@setter方法和 @getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺
setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺 getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
封装:就是不允许外界直接访问成员属性,提供set和get方法给外界,用于设置和获取属性的值。我们可以在set方法里面对参数进行过滤,防止外界的恶意改动。
继承:如果两个类有相同的属性和行为,可以抽取出来组成一个新的类,这个新的类就是前面两个类的父类。子类如果继承了父类,就会有父类所有的属性和方法。子类是对父类的一个扩充。
多态:多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。在使用多态是,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。
2、iOS总结静变量static、全局变量extern、局部变量
1、静态变量 static
什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用static。
静态变量的优点:1、节省内存。静态变量只存储一处,但供所有对象使用。
2、它的值是可以更新的。
3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
2、全局变量extern
什么是全局变量:也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。
作用域是整个源程序。
如果全局便利和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全
局变量。
3、局部变量
什么是局部变量:是在方法内作定义说明的。其作用域仅限于方法内。
3、iOS开发Delegate,Notification,Block使用
1.Delegate(代理、委托)
优点:
1.减少代码的耦合性,使事件监听和事件处理相分离。
2.清晰的语法定义,减少维护成本,较强的代码可读性。
3.不需要创建第三方来监听事件和传输数据。
4.一个控制器可以实现多个代理,满足自定义开发需求,可选必选有较大的灵活性。
缺点:
1.实现委托的代码过程比较繁琐。
2.当实现跨层传值监听的时候将加大代码的耦合性,并且程序的层次结构将变的混乱。
3.当对多个对象同时传值响应的时候,委托的易用性将大大降低。
2.NotificationCenter(通知)
优点:
1.使用简单,代码精简。
2.解决了同时向多个对象监听相应的问题。
3.传值方便快捷,Context自身携带相应的内容。
缺点:
1.使用完毕后,要时刻记得注销通知,否则将出现不可预见的crash。
2.key不够安全,编译器不会监测是否被通知中心正确处理。
3.调试的时候动作的跟踪将很难进行。
4.当使用者向通知中心发送通知的时候,并不能获得任何反馈信息。
5.需要一个第三方的对象来做监听者与被监听者的中介。
3.Block(代码块)
优点:
1.语法简洁,实现回调不需要显示的调用方法,代码更为紧凑。
2.增强代码的可读性和可维护性。
3.配合GCD优秀的解决多线程问题。
缺点:
1.Block中得代码将自动进行一次retain操作,容易造成内存泄露。
2.Block内默认引用为强引用,容易造成循环引用。
4.使用场景对比
1.回调方法
在日常的开发过程中,我们经常会遇到一些完成之后的处理问题,比如完成网路请求之后的回调,或者页面加载完成之后的回调等。这个时候我们一般使用的是前两者方法,即Block或者Delegate。而在一对一传输回
调的时候明显Block的使用更加的简单高效,只需要在代码块中执行所需要的操作即可。在一对多的情况下,Delegate更加能够发挥出自己的优势。
2.跨层通信
有的时候我们需要实现在两个毫无关联的对象之间的通信,这个时候如果使用Block或者Delegate就势必会增加代码的耦合性,这样对于代码的结构来说是不健康的,因此这个时候使用Notification便是明智的选择。
3.UI响应事件
用户在于App的UI进行互动的时候,总会需要App进行交互响应,这个时候就毫无疑问的使用代理设计模式。而苹果官方给出的建议也是可以肯定的,在Cocoa
Touch框架中我们也可以在几乎所有的UI交互控件的头文件里看到Delegate的成员变量,也正是印证了在UI响应事件上Delegate有着绝对的优势。
4.简单值得传递
当需要进行简单值得传递的时候,比如子控件传输给父控件所点击的IndexPath的时候,更加适合使用Block来传值。因为,如果只是为了传这一个简单的值而没有特别的业务处理而定义一个协议,然后实现协议,设置代理再写方法的话将十分麻烦,得不偿失,这个时候简单高效的Block就可以完美的替代Delegate完成任务了。
4、 @synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是 @synthesize,一个是@dynamic。如果
@synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;
@synthesize 的语义是如果你没有手动实现 setter方法和 getter方法,那么编译器会自动为你加上这两个方法。
@dynamic 告诉编译器:属性的 setter与 getter方法由用户自己实现,不自动生成。(当然对于
readonly的属性只需提供 getter即可)。假如一个属性被声明为 @dynamic var,然后你没有提供
@setter方法和 @getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺
setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺 getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
相关文章推荐
- 树的面试题(一):二叉树的镜像
- 《疯狂的程序员》中的专业名词
- 2016前端面试题总结
- [面试编程题]算法基础-字符移位
- [面试编程题1]构造回文
- Java多线程面试问题
- 我要做一个什么样的程序员
- 校招季--献给前端求职路上的你们(JS)
- 每天工作4小时的程序员感悟
- 日后不做程序员了,还可以去修推拉门。
- 国内一线互联网公司内部面试题库
- Java程序员应该了解的第三方工具
- 校招季--献给前端求职路上的你们(个人面试经历分享)
- 编程是可以从事一生的职业吗
- 校招季--献给前端求职路上的你们(H5+C3)
- 程序员最艰巨的十大任务
- Pathon 【iOS程序员如何用Pathon写爬虫】
- 2011程序员薪资调查报告全文发布
- 一个程序员的一生
- 从程序员到软件设计师