1.内存布局
堆栈:方法调用
堆:通过ALLOC等分配的对象
BSS:未初始化的全局变量等
数据:已初始化的全局变量
文本:程序代码
2.内存管理方案
TaggedPointer:小对象(NSNumber)
(非指针型isa)NONPOINTER_ISA 64位架构iOS应用占用64位,本身32 40就够用,为了提高内存利用,剩余比特位存储内存管理相关内容
散列表复杂的结构,弱引用表,引用计数表
NONPOINTER_ISA:
第一位索引0代表指针型isa
第二位has_assoc 1代表有关联对象
第三位has_cxx_dtor表示是否用c ++ arc中也可以表示是否arc管理
weakly_referenced:这个对象是否有弱引用指针
取消分配:当前对象是否再进行dealloc的操作
has_sidetable_rc:当前引用计数达到上限,外挂sidetable数据结构去存储相关引用计数内容
extra_rc:额外的引用计数,计数很小就存在这里面
散列表:
SideTables()结构
3.数据结构
自旋锁:
RefcountMap:
为size_t:
weak_table_t:
4.ARC
5.应用计数管理实现原理
alloc:经过一系列调用,最终调用了c函数calloc,此时并没有设置引用计数为1
retain:
SideTable &table = SideTables()[this];
size_t&refcntStorage = table.refcnts[this];
refcntStorage += SIDE_TABLE_RC_ONE;
release:
SideTable &table = SideTables()[this];
RefcountMap::iterator it = table.refcnts.find(this);
it->second -= SIDE_TABLE_RC_ONE;
retainCount:
dealloc:
object_dispose()实现
objc_destructInstance()实现
clearDeallocating()实现
添加weak变量:
6.自动释放池
是以栈为结点通过双向链表的形式组合而成 和线程一一对应
在当次runloop将要结束的时候调用autoreleasePoolPage::pop(),然后创建新的释放池
多层嵌套就是多次插入哨兵对象
7.循环引用
三种循环引用:自循环引用 相互循环引用 多循环应用
NSTimer 的循环引用
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];