1.事件传递流程
1.用户触摸屏幕,系统将事件加入到UIApplication管理的一个任务队列中
2.UIApplication将处于任务队列最前端的事件向下分发到UIWindow
3.UIWIndow将事件向下分发到UIView
4.UIView先看自己是否能处理事件,如果他的触摸范围内,就继续寻找subView
5.遍历子控件,看某个subView能处理事件
6.如果都没有找到,那就是UIView来处理
7.如果UIView也处理不了,就不做任何处理
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
这个方法会找到最合适的view
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
这个方法是最后响应事件的方法
2.内存泄露
指申请的内存空间使用完毕之后未回收。
3.内存溢出
指程序在申请内存时,没有足够的内存空间供其使用。
4.常见的内存泄露情况
1.NSTimer,target:self,导致VC的引用计数+1,self强引用timer,timer强引用self,造成循环引用。
解决办法:ios10+
使用ios10+ API去开启timer,然后在持有timer的VC中的-(void)dealloc中调用-(void)invidate方法
2.vc中代理使用strong修饰,vc强引用view,view强引用delegate,delegate内部强引用self。造成内存泄露。解决办法:delegate使用weak修饰
3.block中使用self,当block被self持有,block内部在持有self,就会造成循环引用。解决办法:使用__weak 修饰
4.UIWebView的使用,会导致内存暴增。解决办法:使用WKWebView替代
5.加载大图片尽量不要使用[UIImage imageNamed:@""],这个方法会长时间占用内存,使用imageWithContentsOfFile方法
6.AFN的问题,AFHTTPSessionManager是一个对象,不是一个单例。解决办法:封装网路请求时将AFHTTPSessionManager封装成一个单例,进行全局管理。防止内存泄露。
5.内存泄露检测
Xcode自带:cmd+shift+b
第三方:MLeaksFinder