iOS 面试知识点

.1.数据的持久化:plist文件,对象归档,数据库,coredata

2.KVO:键值观察:是一种能使对象获取其他对象变化通知机制

3.KVC:间接访问对象实例变量,可以不通过存取方法访问实例变量

4.浅复制(retain):并不拷贝对象本身,仅仅是拷贝指向对象的指针

5.深复制(copy):直接拷贝整个对象内存到另一块内存中

【再简单些说:浅复制就是指针拷贝;深复制就是内容拷贝。

在非集合类对象中(系统非集合类对象指的是 NSString, NSNumber ... 之类的对象):对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:

[immutableObject copy] // 浅复制

[immutableObject mutableCopy] //深复制

[mutableObject copy] //深复制

[mutableObject mutableCopy] //深复制

在集合类对象中(集合类对象是指NSArray、NSDictionary、NSSet ... 之类的对象),对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:

[immutableObject copy] // 浅复制

[immutableObject mutableCopy] //单层深复制

[mutableObject copy] //单层深复制

[mutableObject mutableCopy] //单层深复制


6.对MVC的理解:

M:(model)   数据模型--》存储 定义 操作数据

V:(view)       表示视图--》用户操作交互

C: (Controller)  控制器--》获取数据 显示在表示视图上面

7.一个APP中有一个button,在手触摸屏幕点击后,到button收到点击事件,中间发生过程?【从响应者链来说】

1.设备将touch到的UITouch和UIEvent对象打包,放到当前活动的Application事件队列中    

2.单例的UIApplication会从事件队列中取出触摸事件并传递给单例UIWindow    

3.UIWindow调用方法查找touch操作的所在视图view

8.UIResponder 是 UIView的 父类   UIView 是 UIControl的父类

9.为什么实用copy申明NSString,若用Strong会有什么问题?

父类可接受子类对象(NSString是NSMUtableString的父类),实用copy是为了不受外界影响,无论是可变还是不可变,保证本身持有一个不可变副本      如果使用strong 那么属性有可能指向一个可变对象,如果这个可变对象被外部修改了,那么影响该属性

10.进程 线程 区别 联系

区别:一个线程只能属于一个进程,线程是操作系统识别的最小执行和调度单位。

           一个进程可以有很多个线程,但至少有一个线程。

             资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程             共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程             拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。

11. 对RunLoop的理解

  什么是RunLoop?

从字面上看:运行循环、跑圈

其实它内部就是do-while循环,在这个循环内部不断的处理各种任务(比如Source、Timer、Observer)

一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run方法)

RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Soure、Timer、Observer,那么就直接退出RunLoop

在开发中如何使用RunLoop?什么应用场景?

开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来消息,处理其他事件)

在子线程中开启一个定时器

在子线程中进行一些长期监控

可以控制定时器在特定模式下执行

可以让某些事件(行为、任务)在特定模式下执行

可以添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有点击事件之前做一些事情

你可能感兴趣的:(iOS 面试知识点)