ios 常见经典面试题总结

2019-02-13  本文已影响0人  不懂技术的工程师

Objective-C Basics

1.请说明并比较以下关键词:strong, weak, assign, copy
2.请说明并比较以下关键词:__weak,__block
3.请说明并比较以下关键词:atomatic,nonatomic
4.什么是ARC

ARC全称是Automatic Reference Counting,是Objective-C的内存管理机制。简单来说,就是代码自动加了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动的由编译器完成了。

ARC的使用是为了解决对象retain和release匹配的问题。以前手动管理造成内存泄露或者重复释放的问题将不复存在。

以前需要手动的通过retain去为对象获取内存,并用release释放内存。所以以前的操作称为MRC(Manual Reference Counting)。

5.什么情况下会出现循环引用?

循环引用是指2个或以上对象互相强引用,导致所有对象无法释放的现象。举个例子:

class Father
@interface Father:NSobject
@property (strong,nonatomic) Son *son;
@end 

class Son
@interface Son:NSobject
@property (strong,nonatomic) Father *father;
@end 

上述代码有两个类,分别为Father和Son,Father对Son强引用,Son对Father强引用。这样释放Son必须要先释放Father,要释放Father必须先释放Son。如此一来,两个对象都无法释放。

解决方法是将Father中的Son对象属性从strong改为weak。

6.以scheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会暂停,为什么?该如何解决?

原因在于滑动时当前线程的runloop切换了model用于列表滑动,导致timer暂停。

runloop中的model主要用来指定事件在runloop中的优先级,有以下几种:

回到题中的情境。滑动列表时,runloop的model由原来的Default模式切换到了Event Tracking模式,timer原来好好的运行在Default模式中,被关闭后自然就停止工作了。

解决方法其一是将timer加入到NSRunloopCommonModes中。其二是将timer放到另一个线程中然后开启另一个线程的runloop,这样可以保证与主线程互不干扰,而现在主线程正在处理页面滑动。示例代码如下:

//方法1
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//方法2
dispath_async(dispath_get_global_queue(0,0),^{
  timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeat:) userInfo:nil repeats:true];
  [[NSRunLoop currentRunLoop] run];
});
7.说一下ios触摸事件是怎么传递并响应的(响应者链 responder chain)
事件传递链

假设用户触摸了上图的 View E 区域,那么 ios 将会按下面的顺序
反复检测 subview 来寻找 Hit-Test View

  1. 触摸区域在视图 A 内,所以检测视图 A 的 subview B 和 C ;
  2. 触摸区域不在视图 B 内 ,但是在视图 C 内,所以检查视图 C 的subview D 和 E;
  3. 触摸区域不在视图 D 内,在视图 E 中;

视图 E 在整个视图体系中是 lowest view,所以视图 E 就是 Hit-Test View(能够响应事件的那个最合适的view)。
总结:事件的传递链由系统向离用户最近的view传递(父视图向子视图传递)。UIKit -> Application event queue -> window -> root view -> ... -> lowest view

事件响应链
上一篇 下一篇

猜你喜欢

热点阅读