MRC、ARC內(nèi)存管理機(jī)制?(為什么要進(jìn)行內(nèi)存管理, 內(nèi)存管理的范圍和對(duì)象, 內(nèi)存管理的原理)
** (為什么)
因?yàn)橐苿?dòng)設(shè)備的內(nèi)存極其有限,當(dāng)一個(gè)程序達(dá)到40M時(shí), 系統(tǒng)會(huì)發(fā)出內(nèi)存警告. 當(dāng)程序達(dá)到120M時(shí), 程序會(huì)閃退, 影響用戶(hù)體驗(yàn). 為了保證程序的運(yùn)行流暢, 必須進(jìn)行內(nèi)存管理
**(管理的范圍及對(duì)象)
管理所有繼承自NSObject的對(duì)象, 對(duì)基本數(shù)據(jù)類(lèi)型無(wú)效. 是因?yàn)閷?duì)象和其他數(shù)據(jù)類(lèi)型在系統(tǒng)中存儲(chǔ)的空間不一樣, 其他局部變量主要存儲(chǔ)在棧區(qū)(因?yàn)榛緮?shù)據(jù)類(lèi)型占用的存儲(chǔ)空間是固定的, 一般存放于棧區(qū) ), 而對(duì)象存儲(chǔ)于堆中, 當(dāng)代碼塊結(jié)束時(shí), 這個(gè)代碼塊所涉及到的所有局部變量會(huì)自動(dòng)清空,指向?qū)ο蟮闹羔樢矔?huì)被回收, 這時(shí)對(duì)象就沒(méi)有指針指向, 但依然存在于堆內(nèi)存中, 造成內(nèi)存泄露.
**(內(nèi)存管理的原理)
MRC下,oc內(nèi)存管理遵循“誰(shuí)創(chuàng)建、誰(shuí)釋放、誰(shuí)引用、誰(shuí)管理”的機(jī)制,當(dāng)創(chuàng)建或引用一個(gè)對(duì)象時(shí),需要向她發(fā)送alloc,copy,retain消息,當(dāng)釋放該對(duì)象時(shí)需要發(fā)送release消息,當(dāng)引用計(jì)數(shù)為零的時(shí)候,系統(tǒng)釋放該對(duì)象。
ARC是自動(dòng)引用計(jì)數(shù),管理機(jī)制與手動(dòng)機(jī)制一樣,只是不再需要調(diào)用retain,release,autorelease,它會(huì)在適當(dāng)?shù)奈恢貌迦雛elease和autorelease。使用ARC不代表不需要內(nèi)存管理了,例如使用block時(shí)要避免循環(huán)引用,代理作為屬性時(shí),要用弱指針指引。