内存管理一之性能优化方向

对象


toggepointer 

尾数代表类型 1字符 2int 3long

前面代表值十六进制


non-toggepointer(64位:1位isa(0代表纯isa指针1代表不止是类对象地址,isa中包含了类信息、对象的引用计数等,2位:has_assoc:关联对象标志位,0没有,1存在,3位has_cxx_dtor是否c++对象。54位:has_sidetable_rc是否有散列表,当对象引用技术 大于10时,则需要借用该 变理存储进位,64:extra_rc引用计数值,如果引用计数大于10就需要散列表来储存))

自悬锁

引用系数表

弱引用表

entrys保存新建的对象的指针

移除weak_table时会先判断entrys数组中是否存在当前这个类的指针如果存在就会直接置为nil,对象马上释放,这样就避免循环引用,然后把weak_table的容量减1掉,之前是增半扩容,再然后把整个entrys里从weak_table里去掉。这样内存空间得到节省

释放对象(dealloc)

引用系数

是否有关联对象

散列表中的引用系数空间

cxx对象

weak与strong区别

从对象修饰符来讲 有未标记、weak、strong、retain

weak的话、、、、 从底层来讲我们不写修饰符他就默认是strong那么他就是先retain新的值然后在释放旧值,

unretained *location=value 是值的传递 ,如果对象变为nil的时候 就会发生内存泄露,因为不是指针的传递

autoreleasePool

oautoreleasePoolpush

AutoreleasePoolPage::push(AutoreleasePoolPage属性是56个字节,一页所能容纳大小4096字节,按理来说最多容纳505个变量另外还要考虑边界符)

一页满的时候产生一个新页面,child,然后把指向那一页赋给当前值,标记成hot,即无限递归

1:添加的时候

2:老爸满了,开避一块新的页面,有一个child

3:然后标志成hot,无限递归

autoreleasePoolPOP

AutoreleasePoolPage::pop(如果是边界面符,出了autorelease的对象都会relase)

1:先找自己的老爸页面,找到了

2:杀自己

3:再把老爸页面变成hot状态

跟runloop有什么关系

大家都知道,在runloop的时候是一个圆环结构,其实runloop会持有autoreleasePoolHandler一个句柄,当在这里面的时候我们创建一些变量,那么runloop会在obser里发出一个push让autolease里添加进去,在快休眠的时候会发出pop的让autorelease里释放出去

你可能感兴趣的:(内存管理一之性能优化方向)