内存管理方案:ARC MRC。我们现在都是ARC
ARC是LLVM和Runtime配合的结果,ARC中禁⽌⼿动调⽤retain/release/retainCount,ARC新加了weak、strong属性关键字
内存布局:
内核区:系统内核处理区域
栈区:函数,方法 ;栈区内存地址:一般为0X7开头
堆区:通过alloc分配对象,block copy ; 堆区内存地址:一般为0x6开头
BSS段:未初始化的全局变量,静态变量
数据段:初始化的全局变量,静态变量; 数据段,BSS内存地址:0X1开头
Text:程序代码,加载到内存中
图(1)alloc:开辟内存,reatain:引用计数 + 1, release: 引用计数-1 ;delloc:释放内存;形成一个闭环 .
retainCount:
图(2)retain/release:
图(3)weak:sideTable的weakTable 弱引⽤表,创建⼀个weak_entry_t,把referent加⼊到weak_entry_t的数组inline_referrers,把weak_table扩容⼀下,把new_entry加⼊到weak_table中
图(4)strong&unsafe_unretain:
图(5)retain的时候存在extra_rc + 1,当extra_rc满了过后就会有放在散列表(sideTable)
TaggedPointer:专⻔⽤来存储⼩的对象,例如NSNumber和NSDate
Tagged Pointer指针的值不再是地址了,⽽是真正的值。所以,实际上它不再
是⼀个对象了,它只是⼀个披着对象⽪的普通变量⽽已。所以,它的内存并不存储
在堆中,也不需要malloc和free
NSObject *objc = [NSObject alloc];
NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)objc));
NSobject 创建对象,allocy引用计数为 0 但是打印为1,这个是问什么?
答案:看下图:rc = 1 + bits.extra_rc;
图(6)
网友评论