iOS面试题四

iOS面试题四

20.系统如何寻找到需要响应用户操作的那个Responder?
简述一些概念:
响应对象(Responder) - 是具有响应和处理事件能力的对象,UIResponder类是所有响应对象的基类。UIApplication、 UIViewController、UIWindow和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder.
响应链:由响应对象造成的的层次结构。

过程:
通常事件可分成三类,
1 触摸事件(Touch Event)
2 运动事件(Motion Event)- 例如 晃动设备
3远程控制事件(Remote-Control Event)

这里我用触摸事件举例:当iOS检测到触摸事件时会将其打包成一个UIEvent对象,并放入当前活动的Application事件队列中,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图,如果pointInside:withEvent:返回YES,则继续其所有子视图的hitTest:withEvent:,直到找到touch操作发生的位置

21.如何手动触发一个value的kvo?
观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应。

22.如何对NSArray中的对象去除?
1.利用NSDictionary的AllKeys(AllValues)方法
可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的。
示例代码:
NSArray *arr = @[@111,@222,@111];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSNumber *number in arr) {
[dict setObject:number forKey:number];
}
NSLog(@”%@”,[dict allValues]);
输出结果为:
2013-05-21 12:03:49.449 test1[4377:c07] (
111,
222
)

2.利用NSSet的AllObjects方法
这种方法更快,利用NSSet不会添加重复元素的特性。不过去重的数组没有进行排序,如果需要排序,可以使用NSSortDescriptor类。
示例代码:
NSArray *arr = @[@111,@222,@111];
NSSet *set = [NSSet setWithArray:arr];
NSLog(@”%@”,[set allObjects]);
输出结果为:
2013-05-21 12:06:26.508 test1[4547:c07] (
111,
222
)

你可能感兴趣的:(ios,面试题)