国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OC基礎(chǔ):內(nèi)存結(jié)構(gòu)與內(nèi)存管理

2019-11-06 09:41:54
字體:
供稿:網(wǎng)友

一、內(nèi)存簡(jiǎn)單介紹

內(nèi)存結(jié)構(gòu)

1、運(yùn)行時(shí)分配

(1)棧:用戶存放程序臨時(shí)創(chuàng)建的局部變量(先進(jìn)后出)。

(2)堆:動(dòng)態(tài)分配內(nèi)存段。

2、編譯器分配

(1)BSS段:存放未初始化的全局變量和靜態(tài)變量。

(2)數(shù)據(jù)段:已初始化的全局變量和靜態(tài)變量。

(3)代碼段:執(zhí)行代碼的一塊區(qū)域。 

地址由低到高代碼段 -> 數(shù)據(jù)段 -> BSS段-> 堆 -> 棧 

內(nèi)存分配方式

1、從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static變量。

2、在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。

3、從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責(zé)任回收它,否則運(yùn)行的程序會(huì)出現(xiàn)內(nèi)存泄漏,頻繁地分配和釋放不同大小的堆空間將會(huì)產(chǎn)生堆內(nèi)碎塊。

 

二、OC內(nèi)存管理(ARC后不用手動(dòng)管理)

1、進(jìn)行內(nèi)存管理的原因:是由于移動(dòng)設(shè)備的內(nèi)存極其有限,所以每個(gè)APP所占的內(nèi)存也是有限制的,當(dāng)app所占用的內(nèi)存較多時(shí),系統(tǒng)就會(huì)發(fā)出內(nèi)存警告,這時(shí)需要回收一些不需要再繼續(xù)使用的內(nèi)存空間,比如回收一些不再使用的對(duì)象和變量等。

2、內(nèi)存管理范圍:任何繼承NSObject的對(duì)象,對(duì)其他的基本數(shù)據(jù)類型無效。

本質(zhì)原因是存儲(chǔ)空間不一樣,對(duì)象存儲(chǔ)于堆中,而其它局部變量主要存放于棧中,當(dāng)代碼塊結(jié)束時(shí)這個(gè)代碼塊中涉及的所有局部變量會(huì)被回收,指向?qū)ο蟮闹羔樢脖换厥眨藭r(shí)對(duì)象已經(jīng)沒有指針指向,但依然存在于內(nèi)存中,造成內(nèi)存泄露。

3、對(duì)象的基本結(jié)構(gòu):每個(gè)OC對(duì)象都有自己的引用計(jì)數(shù)器,是一個(gè)整數(shù)表示對(duì)象被引用的次數(shù),即現(xiàn)在有多少東西在使用這個(gè)對(duì)象。對(duì)象剛被創(chuàng)建時(shí),默認(rèn)計(jì)數(shù)器值為1,當(dāng)計(jì)數(shù)器的值變?yōu)?/code>0時(shí),則對(duì)象銷毀。

在每個(gè)OC對(duì)象內(nèi)部,都專門有4個(gè)字節(jié)的存儲(chǔ)空間來存儲(chǔ)引用計(jì)數(shù)器。

引用計(jì)數(shù)器的作用:判斷對(duì)象是否需要回收的唯一依據(jù)就是計(jì)數(shù)器是否為0,若不為0則存在。4、當(dāng)給對(duì)象發(fā)送消息時(shí),進(jìn)行引用計(jì)數(shù)器操作

Retain消息:使引用計(jì)數(shù)器+1,改方法返回對(duì)象本身

Release消息:使引用計(jì)數(shù)器-1(并不代表釋放對(duì)象)

retainCount消息:獲得對(duì)象當(dāng)前的引用計(jì)數(shù)器值

5、當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器為0時(shí),那么它將被銷毀,其占用的內(nèi)存被系統(tǒng)回收。當(dāng)對(duì)象被銷毀時(shí),系統(tǒng)會(huì)自動(dòng)向?qū)ο蟀l(fā)送一條dealloc消息,一般會(huì)重寫dealloc方法,書寫格式如下:

- (void)dealloc {

    [super dealloc];   //必須調(diào)用此方法且必須寫在最后

}

6、注意事項(xiàng):

野指針錯(cuò)誤:訪問了一塊壞的內(nèi)存(已經(jīng)被回收的,不可用的內(nèi)存)。

僵尸對(duì)象:所占內(nèi)存已經(jīng)被回收的對(duì)象,僵尸對(duì)象不能再被使用。(打開僵尸對(duì)象檢測(cè))

空指針:沒有指向任何東西的指針(存儲(chǔ)的東西是0,null,nil),給空指針發(fā)送消息不會(huì)報(bào)錯(cuò)

注意:不能使用[p retaion]讓僵尸對(duì)象起死復(fù)生。

7、內(nèi)存管理原則

(1)只要還有人在使用某個(gè)對(duì)象,那么這個(gè)對(duì)象就不會(huì)被回收。

   只要你想使用這個(gè)對(duì)象,那么就應(yīng)該讓這個(gè)對(duì)象的引用計(jì)數(shù)器+1。

   當(dāng)你不想使用這個(gè)對(duì)象時(shí),應(yīng)該讓對(duì)象的引用計(jì)數(shù)器-1。

(2)誰創(chuàng)建,誰release

   如果你通過alloc,new,copy來創(chuàng)建了一個(gè)對(duì)象,那么你就必須調(diào)用release或者autorelease方法

   不是你創(chuàng)建的就不用你去負(fù)責(zé)

(3)誰retain,誰release。只要你調(diào)用了retain,無論這個(gè)對(duì)象時(shí)如何生成的,你都要調(diào)用release。

 

三、內(nèi)存管理中的循環(huán)引用問題以及解決

若使用#import的方式相互包含,就會(huì)形成了循環(huán)引用。這時(shí)可以使用一個(gè)@class來代替其中一個(gè)#imPRot來解決循環(huán)引用問題,提高性能!

@class僅僅告訴編譯器,在進(jìn)行編譯的時(shí)候把后面的名字作為一個(gè)類來處理。

書寫規(guī)范:@class 類名;

作用:聲明一個(gè)類,告訴編譯器某個(gè)名稱是一個(gè)類。

具體用法:1、在.h文件中使用@class來聲明類。

     2、在.m文件中真正要使用到的時(shí)候,使用#import來包含類中的所有東西。

     3、兩端循環(huán)引用的解決方法:一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 方正县| 陆川县| 霍邱县| 永川市| 南木林县| 青海省| 高陵县| 桃园县| 沙坪坝区| 民和| 宜兴市| 香港 | 唐河县| 英德市| 比如县| 尼勒克县| 大关县| 潜江市| 资阳市| 竹山县| 林口县| 鲁山县| 孟连| 西丰县| 改则县| 分宜县| 若羌县| 崇左市| 绿春县| 平阳县| 项城市| 宜兴市| 黄骅市| 泸溪县| 英超| 固安县| 汕头市| 晴隆县| 巢湖市| 荣成市| 南郑县|