内存管理

207 阅读1分钟

1.CADisplayLinkNSTimer 会对 target 产生强引用,如果 target 又对它们产生强引用,呢么就会引发循环引用,例如

解决方案采用NSProxy

2.NSProxy没有 init方法,直接 alloc 这个类就是用来做消息转发的,NSProxy会直接进入消息转发过程

3.NSTimer 依赖于 RunLoop,如果 RunLoop 任务过于繁重,会导致计时不准确,GCD 定时器比较准确,跟系统内核挂钩

4.iOS 的内存分布

5.Tagged Pointer

6.OC 对象的内存管理

7.引用计数的存储

8.weak散列表在delloc的时候会找到,SideTable 里面的 weak_table 对弱引用进行清除

8.1 .sideTables模拟器 最多 64 长度,真机 8 长度 模板类是 StripedMap,sideTables里面存储的就是SideTable,weak_table_t是全局的,所以所有的SideTable里的 weekTable都是同一个,weekTable存储所有被弱引用的对象,weak_entry_t存储着被弱引用的对象 ,一个union共用体 里面weak_referrer_t存储着弱引用该对象的地址数组(分为动态数组和固定)

9.自动释放池

10.AutoreleasePoolPage的结构

  1. autorelease 对象什么时候进行 release ,如果被 @autoreleasepool 池包裹,则出了大括号就释放,没有的话,由 RunLoop 来控制的,它可能是在某次 RunLoop 循环中, RunLoop 休眠之前调用了 release