这篇文章主要是记录了,我在学习多线程过程中觉得比较重要概念,在这里做一下总结。
文章还会陆续的增加内容,需要持续的更新……
1、自动释放池
1、基本定义
1 2 3 4 5 6
| 工作原理:自动释放池被销毁或耗尽时会向池中所有对象发送release消息,释放所有的autorelease对象
创建和销毁:每一次运行循环启动会后会自动创建自动释放池
程序执行过程中,所有autorelease对象在出了作用域之后,会被添加到最近创建的自动释放池中
|
2、图片示意
2、运行循环
1、作用和特性
1 2 3 4 5 6
| 作用:保证程序不退出,监听所有时间(手势触摸、时钟触发)
特性:没有事件时,会休眠,一旦监听到事件,就会立即响应
每一个线程都有一个runloop 但是主线程的runloop会默认启动(其他线程的runloop默认是关闭的)
|
2、开启一个运行循环的两种种方法
- 1、 [[NSRunLoop currentRunLoop] run]
1 2
| 这种方法一旦开启了运行循环就再也关不了了,也就是说这之后的程序都无法执行了
|
1 2
| 每隔一段时间,主动调用一次运行循环并且持续一段时间(这就可以响应这段时间内发生的事件),主动调用可以通过设置标志的方法实现
|
3、简述retain、strong、assign、weak、copy有什么区别?
1 2 3 4 5 6 7 8 9 10 11
| -retain:是MRC,在设置数值的时候,会对引用计数器+1 -strong:是ARC,与retain等效 -assign:是ARC/MRC都有,在设置数值时不会做任何的附加操作 -MRC中如果不需要引用,就直接使用assign -ARC中通常是用来保存基本数据类型 -weak是ARC的,用来保存不需要强引用的对象 -weak和assign的区别 -assign 指向的对象如果被释放,地址不会有任何变化,效率高,但是风险大,容易造成野指针错误 -weak 指向的对象如果被释放,地址会立即变为nil ,但是在OC中向nil(空指针)发送消息的时候不会报错
|
4、响应者链条
说一下点击了按钮之后,按钮响应点击事件的原理
1 2 3 4 5 6 7 8
| 程序启动之后,会创建一个程序的代理(AppDelegate),didFinishLaunchingWithOptions之后创建一个主运 行循环(主运行循环的作用是可以保证程序不退出、负责监听所有事件)当按钮 被点击的时候,事件会通过按钮传递给视图(view)进而传递给控制器,然后依 次上传到UIWindow,最后到达运行循环,告诉运行循环,btn被点击了,这时 候运行循环就会给控制器发消息,告诉控制器按钮被点击了,然后在从上向下的 传递过程中,会一次寻找最合适的响应者,而寻找最合适相应者的过程中是通过 hitTest方法递归的一层一层的去寻找(主要用到的方法是:hitTest,pointInside方法)
|
5、TCP和UDP的区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| UDP:(用户数据报协议)---前身是电报
-只管发送,不确认对方是否接收到 -将数据及源和目的封装成数据包中,不需要建立连接 -每个数据报的大小限制在64K之内 -因为无需连接,因此是不可靠协议 -不需要建立连接,速度快 -应用:多媒体教室、流媒体视频、广播 实际开发中用的少 TCP:(传输控制协议)
-建立连接,行程传输数据的通道 -在连接中进行大数据传输(数据大小不受限制) -通过三次握手完成连接,是可靠协议,安全送达 -必须建立连接,效率会稍低 -建立连接时的三次握(1老师在吗? 2我在啊 3我可以问你一个问题吗?) -断开连接四次握手(1老师我没有问题了,2恩好的,3没有问题我下线了,4好的老师)
|
6、通知
1 2 3 4
| 同步的
原因:发生事件,通知中心广播,有可能有多个监听者,设计上使用同步的方式,能保证所有的监听者都对通知做出响应,不会发生遗漏
|
1 2 3 4
| 1、发送字符串给通知中心 2、通知中心广播 3、所有的通知监听方法执行完毕后,才继续执行代码
|
1 2 3 4
| -name : 通知的名称的字符串,通知中心本质上就是监听这个字符串 -object:发布通知的时候,希望传递给监听者的对象 -userInfo:发布通知的时候,希望传递给监听者的附加信息字典
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| - 代理是一对一的,设置delegate属性,在需要的时候,通过delegate调用 selector方法 - 通知是一对多的,只要发生事件,就会以广播的形式,通知所有的监听者 - 通知中心/发布通知的对象不需要知道谁是监听者,发布对象和监听者之间的 耦合度很低
- 监听者需要知道通知的名称字符串,如果发布者还需要传递userInfo字典, 监听者同时需要知道字典的键名 技巧:在OC框架中,如果定义通知,通常通知的名字包含Notification字样,同时key会和通知定义在一起 - 通知监听方法不能有返回值
- 代理可以有返回值
|