基础面试题

1.Difference between shallow copy and deep copy?浅复制和深复制的区别?

  • 浅复制:只复制指向对象的指针,而不复制引用对象本身。
  • 深复制:复制引用对象本身。意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
  • 用网上一哥们通俗的话就是:浅复制就是你和你的影子,你完蛋,你的影子也完蛋。深复制就好比你和你的克隆人,你完蛋,你的克隆人还活着。

2.What is advantage of categories? What is difference between implementing a category and inheritance?类别的作用?继承和类别在实现中有何区别?

  • category 可以在不获悉、不改变原有代码的情况下往里面添加新的方法,只能添加,不能删除、修改。并且如果类别和原有类中的方法名产生冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有三个作用:

1.将类的实现分散到多个文件或多个不同框架中。
2.创建对私有方法的前向引用。
3.向对象添加非正式协议。

  • 继承 可以增加、修改、删除方法,并且可以增加属性。

3.Difference between categories and extensions?类别和类扩展的区别

  • category 和 extension 的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。extension 可以认为是一个私有的 category。

4.What is purpose of delegates?代理的作用?

  • 代理 的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理 可以理解为 java 中的回调监听机制的一种类似。

5.When we call objective_c is runtime language what does it mean?我们说的objective_c是动态运行时语言是什么意思?

  • 多态。主要是将数据类型的确定由编译时,推迟到运行时。这个问题其实涉及到两个概念,运行时和多态。
  • 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
  • 多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物(life)都有一个相同的方法 -eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但调用时我们只调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。因此也可以说,运行时机制是多态的基础~~~

6.Difference between frame and bounds?frame和bounds有什么不同?

  • frame 指的是:该 view 在父 view 坐标系中的位置和大小。(参照点时父亲的坐标系)
  • bounds 指的是:该 view 在自身坐标系中的位置和大小。(参照点是本身坐标系)

7.Difference between method and selector?方法和选择器有何不同?

  • selector 是一个方法的名字
  • method 是一个组合体,包括方法名和实现。

8.Object_c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?

  • object_c 只支持单继承,如果要实现多继承的话,可以通过类别或协议的方式来实现,cocoa 中所有的类都继承于NSObject 的子类,多继承在这里是用 protocol 委托代理 实现的。

9.id 声明的对象有什么特性?

  • id 是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。

10.MVC是什么?有什么特性?为什么在iPhone上被广泛运用?

  • MVC 设计模式是指:模型、视图、控制器。
  • 模型:负责保有应用程序的数据和定义操作数据的逻辑。
  • 视图:显示应用程序的模型数据,而且可以允许对其进行编辑。
  • 控制器:是应用程序的视图对象和模型对象之间的协调者。

11.堆和栈的区别

  • 管理方式:对于 栈 来讲,是由编译器自动管理,无需我们手动控制;对于 堆 来说,释放工作由程序员控制,容易产生memory leak。
  • 申请大小:栈 在Windows下,栈 是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定的,在Windows下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow,因此能从栈得的空间较小。堆 是向高地址扩展的数据结构,是不连续的内存区域。这事由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,怼活得的空间比较灵活,也比较大。
  • 碎片问题:对于堆来讲,频繁的new/delegate势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存快从栈中间弹出。
  • 分配方式:堆事动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloc函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
  • 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,他的机制很是复杂的。

12.自动释放池是什么,如何工作

  • 当你向一个对象发送一个auto release消息时,cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正常的对象,因此自动释放池定义的作用域内的其他队形可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
    1.object_c 是通过一种“referringcounting”(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为1,以后每当碰到copy、retain的时候引用计数就会加1,每当碰到release和auto release的时候引用计数就会减1,如果此对象的计数变为了0,就会被系统销毁。
    2.NSAutoreleasePool 就是用来做引用计数管理工作的,这个东西不用我们管理的。
    3.auto release 和 release 没什么区别,只是引用计数减1的时机不同而已,auto release 会在对象的使用真正结束的时候才做引用计数减1.

13.UIView和CALayer的区别和联系

  • UIview 相比 CALayer 最大的区别是 UIview 继承 NSResponse,可以响应用户事件,而CALayer 继承于 NSObject 不可以响应用户的点击事件。
  • UIview 侧重于显示内容的管理,CALayer侧重于对内容的绘制。
  • UIview 和 CALayer 是相互依赖的关系。UIview 的显示依赖于 CALayer 提供的内容,CALayer 依赖于UIview的容器来显示绘制的内容。
  • UIview 来自于 CALayer,高于CALayer,是CALayer的高层实现与封装。UIview的所有特性来源于CALayer的支持。

14.drawRect 和 layoutSubviews 的区别

  • 两个方法都是异步执行的,layoutSubviews 方便数据计算,drawRect 方便视图重绘。
  • layoutSubviews 是对 subviews 重新布局。
  • layoutSubviews 方法调用先于 drawRect。

15.线程和进程的区别和联系?

  • 线程是进程的基本单位。
  • 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该单元实现系统对应用的并发性。
  • 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下,不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率更差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

****

****

****

****

****

你可能感兴趣的:(基础面试题)