對象
toggepointer
尾數(shù)代表類型 1字符 2int 3long
前面代表值十六進制
non-toggepointer(64位:1位isa(0代表純isa指針1代表不止是類對象地址,isa中包含了類信息署惯、對象的引用計數(shù)等,2位:has_assoc:關(guān)聯(lián)對象標志位,0沒有,1存在,3位has_cxx_dtor是否c++對象镣隶。54位:has_sidetable_rc是否有散列表,當對象引用技術(shù) 大于10時极谊,則需要借用該 變理存儲進位,64:extra_rc引用計數(shù)值,如果引用計數(shù)大于10就需要散列表來儲存))
自懸鎖
引用系數(shù)表
弱引用表
entrys保存新建的對象的指針
移除weak_table時會先判斷entrys數(shù)組中是否存在當前這個類的指針如果存在就會直接置為nil,對象馬上釋放安岂,這樣就避免循環(huán)引用轻猖,然后把weak_table的容量減1掉,之前是增半擴容域那,再然后把整個entrys里從weak_table里去掉咙边。這樣內(nèi)存空間得到節(jié)省
釋放對象(dealloc)
引用系數(shù)
是否有關(guān)聯(lián)對象
散列表中的引用系數(shù)空間
cxx對象
weak與strong區(qū)別
從對象修飾符來講 有未標記、weak次员、strong败许、retain
weak的話、淑蔚、市殷、、 從底層來講我們不寫修飾符他就默認是strong那么他就是先retain新的值然后在釋放舊值刹衫,
unretained *location=value 是值的傳遞 醋寝,如果對象變?yōu)閚il的時候 就會發(fā)生內(nèi)存泄露,因為不是指針的傳遞
autoreleasePool
oautoreleasePoolpush
AutoreleasePoolPage::push(AutoreleasePoolPage屬性是56個字節(jié),一頁所能容納大小4096字節(jié)绪妹,按理來說最多容納505個變量另外還要考慮邊界符)
一頁滿的時候產(chǎn)生一個新頁面,child,然后把指向那一頁賦給當前值甥桂,標記成hot,即無限遞歸
1:添加的時候
2:老爸滿了邮旷,開避一塊新的頁面,有一個child
3:然后標志成hot,無限遞歸
autoreleasePoolPOP
AutoreleasePoolPage::pop(如果是邊界面符蝇摸,出了autorelease的對象都會relase)
1:先找自己的老爸頁面婶肩,找到了
2:殺自己
3:再把老爸頁面變成hot狀態(tài)
跟runloop有什么關(guān)系
大家都知道办陷,在runloop的時候是一個圓環(huán)結(jié)構(gòu),其實runloop會持有autoreleasePoolHandler一個句柄律歼,當在這里面的時候我們創(chuàng)建一些變量民镜,那么runloop會在obser里發(fā)出一個push讓autolease里添加進去,在快休眠的時候會發(fā)出pop的讓autorelease里釋放出去