面试题系列(一)

来源:互联网 发布:最优化理论与方法pdf 编辑:程序博客网 时间:2024/05/17 12:47

1.进程和线程有什么区别,存在什么联系?

进程:

在系统中正在运行的一个应用程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址,一个进程所拥有的数据和变量只属于他自己。

线程:

进程中相对独立的可执行单元,所以也成为轻量线程,是操作系统进行任务调度的基本单元,他与父进程的其他线程共享进程所拥有的全部代码空间和全局变量,但用于独立的堆栈(局部变量对于线程来说是私有的)。线程是进程的一部分,一个没有线程的进程可以看作是单线程,线程有时候被称为轻量进程,也是CPU调度的一个基本单位。

联系:

一个进程至少拥有一个线程—主线程,也可以拥有多个线程,一个线程必须拥有一个父进程,多个进程可以并发执行,一个线程可以创建和撤销另外一个线程,同一个进程的多个线程之间可以并发执行。

区别:

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程造成影响。线程是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,单线程之间没有单独的地址空间,一个线程死掉等于整个进程死掉,所以,多进程的程序比多线程的程序健壮。

2.浅复制和深复制的区别

要实现copy功能,须遵守nscopying协议,并实现协议规定的方法

深拷贝:

a.源对象和副本对象是不同的2个对象
b.源对象引用计数不变,副本对象引用计数加1
c.产生了新的对象

浅复制:

a.源对象和副本对象是统一对象
b.源对象(副本对象)引用计数加1,相当于做一次retain操作
c.没有产生新的对象

3.内存中堆区和栈区的区别

堆区(heap)一般是由程序员分配与释放,若程序员不释放,则会内存溢出。
栈区(stack)由编译器自动分配释放,存放方法的参数值,局部变量的值。

4.属性修饰符

assign:普通赋值,一般常用于基本数据类型
retain:引用计数加1,获得对象的所有权
nonatomic:不加同步,多线程并发访问会提高性能。
strong:强引用;weak:弱引用,在ARC中,使用strong告诉编译器帮助我们自动插入retain,weak是普通赋值,相当于手动管理内存的assign。_unsafe_unretained与weak功能一致。区别在于指向的对象销毁后,weak会将变量置为nil,防止野指针。ARC也存在内存泄漏的可能。

5.自动释放池

是nsautorelease类的一个实例,当向一个对象发送autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象。

6.KVO KVC

KVC(键值编码)是一种简介访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。
KVO(键值观察)是一种能使得对象获取到其他对象属性变化的通知机制

7.new和init/alloc的区别

基本相同,区别在于alloc分配内存的时候使用了zone,zone在给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升程序处理速度。而且init有很多方法

8.代理delegate和通知、block的使用区别

代理与block一般用于2个对象1对1的通信,代理需要定义协议方法,代理对象实现代理方法,并且需要建立代理关系才可以实现通信。block更加简洁,不需要定义繁琐的协议方法,但是通信事件比较多的话,建议使用代理,通知主要用于1对多的情况下通信,而且通信对象之间不需要建立联系,但是使用通知,代码的可读性差。

原创粉丝点击