查漏补缺三

2020-11-24  本文已影响0人  纳兰沫

解释一下 事件响应 的过程?

  苹果注册了一个 Source1 (基于 mach port 的) 用来接收系统事件,其回调函数为 __IOHIDEventSystemClientQueueCallback()。
  当一个硬件事件(触摸/锁屏/摇晃等)发生后,首先由 IOKit.framework 生成一个 IOHIDEvent 事件并由 SpringBoard 接收。这个过程的
详细情况可以参考这里。SpringBoard 只接收按键(锁屏/静音等),触摸,加速,接近传感器等几种 Event,随后用 mach port 转发给
需要的 App 进程。随后苹果注册的那个 Source1 就会触发回调,并调用 _UIApplicationHandleEventQueue() 进行应用内部的分发。
  _UIApplicationHandleEventQueue() 会把 IOHIDEvent 处理并包装成 UIEvent 进行处理或分发,其中包括识别 UIGesture/处理
屏幕旋转/发送给 UIWindow 等。通常事件比如 UIButton 点击、touchesBegin/Move/End/Cancel 事件都是在这个回调中完成的

解释一下 手势识别 的过程?

当上面的 _UIApplicationHandleEventQueue() 识别了一个手势时,其首先会调用 Cancel 将当前的 touchesBegin/Move/End 系列
回调打断。随后系统将对应的 UIGestureRecognizer 标记为待处理。

苹果注册了一个 Observer 监测 BeforeWaiting (Loop即将进入休眠) 事件,这个 Observer 的回调函数是 _UIGestureRecognizerUpdateObserver(),
其内部会获取所有刚被标记为待处理的 GestureRecognizer,并执行GestureRecognizer 的回调。

当有 UIGestureRecognizer 的变化(创建/销毁/状态改变)时,这个回调都会进行相应处理

什么是 Mimetype ?

在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有 Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME Type,也就是该资源的媒体类型。

//向该文件发送请求,根据请求头拿到该文件的MIMEType
-(NSString *)getMIMETypeURLRequestAtPath:(NSString*)path
{
    //1.确定请求路径
    NSURL *url = [NSURL fileURLWithPath:path];
     
    //2.创建可变的请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //3.发送请求
    NSHTTPURLResponse *response = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
   
    NSString *mimeType = response.MIMEType;
    return mimeType;
}

大文件下载 的功能有什么注意点?

注意要边下载数据边写入文件,不然会造成占用内存空间过大

说一下 GCD 并发队列实现机制?

利用的时间片轮转

多线程的 并行 和 并发 有什么区别?

并行:充分利用计算机的多核,在多个线程上同步进行 
并发:在一条线程上通过快速切换,让人感觉在同步进行

子线程是否会出现死锁?说一下场景?

dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue, ^{
       
        dispatch_sync(serialQueue, ^{
            
            NSLog(@"deadlock");
        });
    });

在什么情况下会触发 KVO?

1.使用了KVC

使用了 `KVC`,如果有访问器方法,则运行时会在访问器方法中调用 `will/didChangeValueForKey:` 方法; 没用访问器方法,运行时会在 `setValue:forKey` 方法中调用 `will/didChangeValueForKey:`方法。

2.有访问器方法

运行时会重写访问器方法调用 `will/didChangeValueForKey:` 方法。 因此,直接调用访问器方法改变属性值时,`KVO` 也能监听到。

3.直接调用

显式调用 `will/didChangeValueForKey:` 方法。

如何优化 APP 的电量?

程序的耗电主要在以下四个方面:
*   CPU 处理
*   定位
*   网络
*   图像
优化的途径主要体现在以下几个方面:

尽可能降低 CPU、GPU 的功耗。
尽量少用 定时器。
优化 I/O 操作。
不要频繁写入小数据,而是积攒到一定数量再写入
读写大量的数据可以使用 Dispatch_io ,GCD 内部已经做了优化。
数据量比较大时,建议使用数据库
网络方面的优化
减少压缩网络数据 (XML -> JSON -> ProtoBuf),如果可能建议使用 ProtoBuf。
如果请求的返回数据相同,可以使用 NSCache 进行缓存
使用断点续传,避免因网络失败后要重新下载。
网络不可用的时候,不尝试进行网络请求
长时间的网络请求,要提供可以取消的操作
采取批量传输。下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下载多个
定位层面的优化
如果只是需要快速确定用户位置,最好用 CLLocationManager 的 requestLocation 方法。定位完成后,会自动让定位硬件断电
如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
尽量降低定位精度,比如尽量不要使用精度最高的 kCLLocationAccuracyBest
需要后台定位时,尽量设置 pausesLocationUpdatesAutomatically 为 YES,如果用户不太可能移动的时候系统会自动暂停位置更新
尽量不要使用 startMonitoringSignificantLocationChanges,优先考虑 startMonitoringForRegion:
硬件检测优化
用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

组件里面的图片怎么获取

NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *currentBundleName = currentBundle.infoDictionary[@"CFBundleName"];
NSString *imagePath = [currentBundle pathForResource:@"image@2x.png" ofType:nil inDirectory:[NSString stringWithFormat:@"%@.bundle",currentBundleName]];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

如果以后做业务组件,需要依赖我们的私有组件,可以省略本地验证/本地验证,只要我们的提交是成功的就行了

image.png image.png image.png
image.png image.png image.png
image.png image.png image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读