多线程 相关概念

iOS基础

这篇文章主要是记录了,我在学习多线程过程中觉得比较重要概念,在这里做一下总结。

文章还会陆续的增加内容,需要持续的更新……

1、自动释放池

1、基本定义
1
2
3
4
5
6
工作原理:自动释放池被销毁或耗尽时会向池中所有对象发送release消息,释放所有的autorelease对象

创建和销毁:每一次运行循环启动会后会自动创建自动释放池

程序执行过程中,所有autorelease对象在出了作用域之后,会被添加到最近创建的自动释放池中

2、图片示意

autoreleasepool

2、运行循环

1、作用和特性
1
2
3
4
5
6
作用:保证程序不退出,监听所有时间(手势触摸、时钟触发)

特性:没有事件时,会休眠,一旦监听到事件,就会立即响应

每一个线程都有一个runloop 但是主线程的runloop会默认启动(其他线程的runloop默认是关闭的)

2、开启一个运行循环的两种种方法
  • 1、 [[NSRunLoop currentRunLoop] run]
1
2
这种方法一旦开启了运行循环就再也关不了了,也就是说这之后的程序都无法执行了

  • 2、间隔主动调用
1
2
每隔一段时间,主动调用一次运行循环并且持续一段时间(这就可以响应这段时间内发生的事件),主动调用可以通过设置标志的方法实现 

runloop

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、通知中心是同步的还是异步的?
1
2
3
4
同步的

原因:发生事件,通知中心广播,有可能有多个监听者,设计上使用同步的方式,能保证所有的监听者都对通知做出响应,不会发生遗漏

  • 2、通知执行的三个步骤
1
2
3
4
1、发送字符串给通知中心
2、通知中心广播
3、所有的通知监听方法执行完毕后,才继续执行代码

  • 3、通知里到底有什么
1
2
3
4
-name : 通知的名称的字符串,通知中心本质上就是监听这个字符串
-object:发布通知的时候,希望传递给监听者的对象
-userInfo:发布通知的时候,希望传递给监听者的附加信息字典

  • 4、通知和代理有什么区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 代理是一对一的,设置delegate属性,在需要的时候,通过delegate调用
selector方法

- 通知是一对多的,只要发生事件,就会以广播的形式,通知所有的监听者

- 通知中心/发布通知的对象不需要知道谁是监听者,发布对象和监听者之间的 耦合度很低

- 监听者需要知道通知的名称字符串,如果发布者还需要传递userInfo字典,
监听者同时需要知道字典的键名

技巧:在OC框架中,如果定义通知,通常通知的名字包含Notification字样,同时key会和通知定义在一起

- 通知监听方法不能有返回值

- 代理可以有返回值