TCP是保证数据可靠传输的。那么TCP是怎么保证传输可靠的呢?TCP有特定的计时器来保证正常的工作。重传计时器是为了保持数据丢失的时候,避免发送端无线等待接收方的ACK包。
重传计时器超时重传重传计时器的创建TCP发送报文段时,就创建了特定报文的重传计时器因此 Q1:重传计时器可能同时存在多个?
重传计时器的撤销or重置当在计时器截止时间之前收到了特定报文的ACK,则该计时器被撤销当在计时器截止时间之前没有收到特定报文的ACK(两个情况,发送成功,但是ACK包因为其他原因没有及时到达;发送失败。对发送方来说,发送方会认为是发送失败),则重传这个报文,并重置计时器
重传超时时间(RTO,R...
这是读《TCP/IP》的笔记之一,很多内容都是书上看的,然后图片是根据书中的内容绘制出来的。ps:TCP/IP这本书,真的有点厚,不知道什么时候能看完。
TCP报文结构TCP头部结构
每个字段的含义CWR:通知接收方,已将拥塞窗口缩小(跟下面的ECE一起用)ECE:通知接收方,接收方到这边的网络有阻塞URG:头部的紧急指针是否有效ACK:响应PSH:不缓存,马上处理RST:连接重置SYN:建立连接FIN:关闭连接
TCP连接管理以上内容解释完之后,来看一下TCP为什么是安全可靠的
首先是连接的过程,采用了我们耳熟能详的“三次握手”,请看下面这张图片解释一下其中的几个状态:
SYN-...
问题
iOS如何管理内存
对象的引用计数是如何管理的
对象的引用计数保存在哪里
对象的引用计数是如何修改的iOS采用自动释放池技术和ARC技术管理堆内存
iOS内存分区
栈区:
堆区:
全局区:
文字常量区
程序代码区
ARCARC的全称是AutoReleaseConference自动引用计数 区别于MRC,程序员不需要手动释放,
对于实例变量,编译器会在合适的位置插入内存管理语句
对于临时变量,采用自动释放池技术管理对象的引用计数
autoreleasepool autoreleasepool也就是前文提到的自动释放池技术,详情可参考自动释放池的原理
管理对象的引用计数...
什么是锁锁是保证线程安全的手段,保证临界区的代码同一时间只能有一个线程执行,使得类的行为和规范一致。
使用场景我们常用锁来避免多线程引起的资源竞争等问题
definitions wikipedia
临界区:一块对公共资源进行访问的代码,并非一种机制或是算法
自旋锁(spin lock):spin 顾名思义,do while 忙等待 优点是避免了上下文调度开销 缺点是耗CPU 只适合短时间的任务
互斥锁(mutex lock) 休眠状态等锁
读写锁(rwlock): 处于“写锁”时任何操作都要休眠等锁
递归锁(recursive lock):是互斥锁的一个特例 允许同一个线程在未释放拥...
why一般情况下,weak修饰对象,assign修饰基本数据类型。
weak和assign,并不会增加对象的rc
assign修饰的对象,出栈后,对象所指向的内存块极有可能被回收,如果此时再访问指针,会出现野指针的情况
weak修饰的对象,因为weak所修饰的对象被系统回收之后,指针会被置为nil,不会出现也指针
下面会从源码中一探究竟。(源码的版本是objc4-723)weak 源码源码中出现的数据结构
SideTables
123static StripedMap<SideTable>& SideTables() { return *rei...
触摸事件的响应机制:
系统检测到触摸等事件后,会将事件打包成UIEvent对象发给当前活动的APP的事件队列。
UIApplication会从事件队列中取出事件并传递给UIWindow
UIWindow会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View)
hitTest:withEvent:会在当前视图上调用pointInside:withEvent:方法判断触摸点是否在当前视图内。若返回NO则hitTest:withEvent:返回nil,若返回YES则向当前视图的所有subviews发送hitTest:withEvent:直到有子视图...
先介绍分类:分类可以为已经存在的类添加方法,还可以把类的实现分在几个不同的文件里。
问题分类可以添加属性吗?分类可以添加实例变量吗?分类方法会覆盖原来的类方法?回答与解释##Q1&Q2:下面这段话摘自美团点评的文章:
category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)我们可以在objc的源码中看到category的结构,如下:12345678typedef struct category_t { const char *name;// 类名 classref_...
最开始的时候呢,是看了sunny的博客:http://blog.sunnyxx.com/2014/08/30/objc-pre-main/和mike ash的博客:https://www.mikeash.com/pyblog/friday-qa-2012-11-09-dyld-dynamic-linking-on-os-x.html但是没看过源码一头雾水的,所以花了周末的时间,看了源码。下面的是我的一些总结,也算是题纲。然后我的草稿也继续保留。刚开始写博客,希望思路会越来越好。引自sunny的博客
dyld(the dynamic link editor),Apple 的动态链接器,系...
确切地说是我目前采用的方案。
有更新会po到笔记中来为什么要做用户轨迹追踪
快速定位用户反馈的问题
运营可自定义追踪行为,方便研究
为产品定位做更多的参考
期待达到的效果
追踪代码和业务代码分离
抽离出来作为其他项目的Kit使用
根据后台动态下发的文件追踪相应的页面、事件,并根据设置确定日志上传时机
思路1. 追踪页面轨迹 主要借助nav的api
记下push\popset\present\dismiss的日志 对于每个一vc用地址、className来标记,前者用来标记vc数组,后者用来匹配路径
对于有tab的app,记录下当前的tab页很重要。我采用的方法是...
背景前文提到了weak修饰对象原理。对于iOS如何管理内存的释放销毁,还需要知道自动释放池技术,故本文会在源码的基础上讨论。
autoreleasepool总结:
ARC下,非alloc/new/copy/mutableCopy开头的类方法默认返回的是autoreleased对象,编译器会自动插入相关的autorelease语句
主线程的runloop进入时(entry),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。
准备进入休眠(BeforeWaiting) 时调用_objc_autoreleasePoolPop() 和 _objc_auto...