对象
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里释放出去