- 简要说一下
autoreleasePool
的数据结构
简单说是
双向链表
,每张链表头尾相接,有parent、child
指针,每创建一个池子,会在首部创建一个哨兵
对象作为标记,最外层池子的顶端会有一个next
指针。当链表容量满了,就会在链表的顶端,并指向下一张表
- 说一下
autoreleasePool
的实现原理
autoreleasePool
是一个延时release
的机制,在自动释放池被销毁或耗尽时,会向池中的所有对象发送release
消息,释放所有autorelease
对象
autoreleasePool
并没有单独的结构,而是由若干个autoreleasePoolPage
作为结点以双向链表
的形式组合而成
- 每一个指针代表一个加入到释放池的
对象
或者是哨兵
对象,哨兵对象是在@autoreleasepool{}
构建的时候插入的- 当自动释放池
pop
的时候,所有哨兵对象之后的对象都会release
- 链表会在一个
Page
空间占满时进行增加,一个autoreleasePoolPage
的空间被占满时,会新建一个autoreleasePoolPage
对象连接链表,后来的autorelease
对象在新的page
加入
- 解释一下三次握手和四次挥手
- 三次握手
- 由客户端向服务端发送
SYN
同步报文- 当服务端收到
SYN
同步报文之后,会返回给客户端SYN
同步报文和ACK
确认报文- 客户端会向服务端发送
ACK
确认报文,此时客户端和服务端的连接正式建立
- 四次挥手
- 先由客户端向服务端发送
FIN
结束报文- 服务端会返回给客户端
ACK
确认报文。此时,由客户端发起的断开连接已经完成- 服务端会发送给客户端
FIN
结束报文和ACK
确认报文- 客户端会返回
ACK
确认报文到服务端,至此,由服务端方向的断开连接已经完成
拓展:
SYN
攻击
在三次握手过程中,Server