一直想找一个平台来整理、收集面试题,但是却毫无头绪,现在有了个人博客,就可以将一些知识点以及面试题整理出来,以后自己可以当做学习复习用。
为什么要整理面试题
整理面试题的好处在于更加有条理的梳理巩固知识,不对导致盲目学习。已达到较快速度的掌握一门语言(知识)。
面试题来源
本人会将自己看过的,以及别人整理过的面试题都整理出来。当然,如果你有好的面试题或者对已有的面试题有更好的答案,可以留言,或者Q我,我会非常高兴。
面试题
1、delegate和notification什么区别,什么情况使用?
Delegate
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。Notification
消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。
2、什么是MVC,为什么使用MVC,有什么好处?
分别为:模型(Model),视图(View)和控制(Controller)
模型(Model)
“数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。
视图(View)
视图层能够实现数据有目的显示。
控制器(Controller)
控制器起到不同层面间的组织作用,用于控制应用程序的流程。
3、同步请求和异步请求什么区别?
发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,
异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行。
4、UIViewController的生命周期
当一个视图控制器被创建,并在屏幕上显示的时候。代码的执行顺序:
// 视图显示在屏幕上的顺序
1、alloc
创建对象,分配空间。
2、init (initWithNibName)
初始化对象,初始化数据。
3、loadView
从nib载入视图,这一步不需要去干涉。除非没有使用xib文件创建视图。
4、viewDidLoad
加载完毕,可以进行自定义数据以及动态创建其他控件。
5、viewWillAppear
视图将出现在屏幕之前,马上这个视图即将显示在屏幕上。
6、viewDidAppear
视图已在屏幕上渲染完成。
// 视图将被从屏幕上移除的顺序
1、viewWillDisappear
视图将被从屏幕上移除之前执行。
2、viewDidDisappear
视图已经被从屏幕上移除。
3、dealloc
视图被销毁,此时需要在init和viewDidLoad中创建的对象进行释放。
4、viewDidUnload
出现内存警告在内存不足时执行,并对所有非当前显示的controller执行。
本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。
因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。
5、iOS数据持久化方式
属性列表、对象归档、SQLite3和Core Data
6、Objective-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
Objective-C的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;
Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
7、#import跟#include有什么区别,@class呢,#import<>跟 #import””有什么区别?
#import
是Objective-C导入头文件的关键字,#include
是C/C++导入头文件的关键字,使用#import
头文件会自动只导入一次,不会重复导入,相当于#include
和#pragma once
;@class
告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>
用来包含系统的头文件,#import""
用来包含用户头文件。
8、定义属性时,什么情况使用copy、assign、retain?
assign用于简单数据类型,如NSInteger,double,bool等;
retain和copy用于对象,copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。retain 会使计数器加一,也可以解决assign的问题。
9、浅拷贝和深拷贝区别是什么?
浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
深拷贝:复制引用对象本身。
10、类别的作用?继承和类别在实现中有何区别?
category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
11、消息传递原理?
12、如何为Class 定义一个对外只读对内可读写的属性?
方案一:在.h头文件中定义一个属性对外是readonly的,但在类的内部希望是可读写的,所以可以在.m源文件中的@interface部分重新定义此属性为readwrite,此时此属性对外是只读的,对内是读写的。
|
|
问题补充区
9.1 对深浅拷贝的一些补充
【情景】
A视图将数组a_Arr
传递给B视图的数组b_Arr
。B视图对数组b_Arr
进行了数据修改之类的操作。会导致A视图的数组a_Arr
数据也跟着改变。
使用如下代码:
|
|
【原因分析】
调用copy
和mutableCopy
只对于数组本身有效,数组里面对象的指针(内存地址)是不变的。一旦修改数组里面对象的数据,原始数组的对象也会跟着改变。
所以如果在进行数据传递的时候需要在下一级或者其他视图对传递的数据进行数据变更的时候。我们应该这样操作:
|
|
使用initWithArray:copyItems:
方法,不仅仅将数组进行时深拷贝,也将数组里面的每一个对象都进行深拷贝,避免视图B对传递的数据进行修改导致数据不对应。
如果数组里面是自定义对象,还需要对象实现NSCopying协议。
微博: @Danny_吕昌辉
博客: SuperDanny