版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、內(nèi)存管理講師:李德山內(nèi)存移動設(shè)備的內(nèi)存極其有限,每個app所能占用的內(nèi)存是有限制的 下列行為都會增加一個app的內(nèi)存占用創(chuàng)建一個OC對象定義一個變量調(diào)用一個函數(shù)或者方法當(dāng)app所占用的內(nèi)存較多時,系統(tǒng)會發(fā)出內(nèi)存警告,這時得回收一些不需要再使用的內(nèi)存空間。比如回收一些不需要使用的對象、變量等如果app占用內(nèi)存過大系統(tǒng)可能會強(qiáng)制關(guān)閉app, 造成閃退現(xiàn)象, 影響用戶體驗(yàn)內(nèi)存管理如何回收那些不需要再使用的對象?那就得學(xué)會OC的內(nèi)存管理所謂內(nèi)存管理, 就是對內(nèi)存進(jìn)行管理, 涉及的操作有:分配內(nèi)存 : 比如創(chuàng)建一個對象, 會增加內(nèi)存占用清除內(nèi)存 : 比如銷毀一個對象, 能減小內(nèi)存占用內(nèi)存管理的管理范圍任
2、何繼承了NSObject的對象對其他非對象類型無效(int、char、float、double、struct、enum等 )只有OC對象才需要進(jìn)行內(nèi)存管理的本質(zhì)原因OC對象存放于堆里面非OC對象一般放在棧里面(棧內(nèi)存會被系統(tǒng)自動回收)內(nèi)存棧內(nèi)存(非OC對象)堆內(nèi)存(OC對象)a = 10b = 20地址:0 xffc0Car對象計(jì)數(shù)器 = 1c = 0 xffc0堆和棧personFfff10Count = 0rFff20Count = 1r2Fff30Count = 0personFfff10Count = 0rFff20Count = 0personrroom_room好悶啊 強(qiáng)烈要求加通
3、風(fēng)口循環(huán)引用Person 0_dogDog0_personpersondog多個對象之間不要封閉的環(huán)如出現(xiàn)這個那么環(huán)中所有對象都不會釋放解決方法:其中一端必須是assignA_bB_cD_aC_d什么是引用計(jì)數(shù)器系統(tǒng)是如何判斷 什么時候需要回收一個對象所占用的內(nèi)存?根據(jù)對象的引用計(jì)數(shù)器什么是引用計(jì)數(shù)器每個OC對象都有自己的引用計(jì)數(shù)器它是一個整數(shù)從字面上, 可以理解為”對象被引用的次數(shù)”也可以理解為: 它表示有多少人正在用這個對象OC對象4字節(jié) 引用計(jì)數(shù)器每個OC對象內(nèi)部都有4個字節(jié)的存儲空間來存放引用計(jì)數(shù)器引用計(jì)數(shù)器的作用簡單來說, 可以理解為: 引用計(jì)數(shù)器表示有多少人正在使用這個對象當(dāng)沒有任
4、何人使用這個對象時, 系統(tǒng)才會回收這個對象, 也就是說當(dāng)對象的引用計(jì)數(shù)器為0時, 對象占用的內(nèi)存就會被系統(tǒng)回收如果對象的計(jì)數(shù)器不為0,那么在整個程序運(yùn)行過程,它占用的內(nèi)存就不可能被回收(除非整個程序已經(jīng)退出 )任何一個對象, 剛生下來的時候, 引用計(jì)數(shù)器都為1當(dāng)使用alloc、new或者copy創(chuàng)建一個對象時,對象的引用計(jì)數(shù)器 + 1 引用計(jì)數(shù)器的操作要想管理對象占用的內(nèi)存, 就得學(xué)會操作對象的引用計(jì)數(shù)器引用計(jì)數(shù)器的常見操作給對象發(fā)送一條retain消息, 可以使引用計(jì)數(shù)器值+1(retain方法返回對象本身)給對象發(fā)送一條release消息, 可以使引用計(jì)數(shù)器值-1給對象發(fā)送retainCo
5、unt消息, 可以獲得當(dāng)前的引用計(jì)數(shù)器值需要注意的是: release并不代表銷毀回收對象, 僅僅是計(jì)數(shù)器-1dealloc當(dāng)一個對象的引用計(jì)數(shù)器值為0時這個對象即將被銷毀,其占用的內(nèi)存被系統(tǒng)回收系統(tǒng)會自動給對象發(fā)送一條dealloc消息(因此, 從dealloc方法有沒有被調(diào)用, 就可以判斷出對象是否被銷毀)dealloc方法的重寫一般會重寫dealloc方法, 在這里釋放相關(guān)資源, dealloc就是對象的遺言一旦重寫了dealloc方法, 就必須調(diào)用super dealloc,并且放在最后面調(diào)用使用注意不能直接調(diào)用dealloc方法一旦對象被回收了, 它占用的內(nèi)存就不再可用, 堅(jiān)持使用會
6、導(dǎo)致程序崩潰(野指針錯誤) 野指針空指針僵尸對象已經(jīng)被銷毀的對象(不能再使用的對象)野指針指向僵尸對象(不可用內(nèi)存)的指針給野指針發(fā)消息會報(bào)EXC_BAD_ACCESS錯誤空指針沒有指向存儲空間的指針(里面存的是nil, 也就是0)給空指針發(fā)消息是沒有任何反應(yīng)的為了避免野指針錯誤的常見辦法在對象被銷毀之后, 將指向?qū)ο蟮闹羔樧優(yōu)榭罩羔橁P(guān)閉ARC功能要想手動調(diào)用retain、release等方法 , 就必須關(guān)閉ARC功能開啟僵尸對象監(jiān)控默認(rèn)情況下,Xcode是不會管僵尸對象的,使用一塊被釋放的內(nèi)存也不會報(bào)錯。為了方便調(diào)試,應(yīng)該開啟僵尸對象監(jiān)控多對象內(nèi)存管理單個對象的內(nèi)存管理, 看起來非常簡單如果
7、對多個對象進(jìn)行內(nèi)存管理, 并且對象之間是有聯(lián)系的, 那么管理就會變得比較復(fù)雜其實(shí), 多個對象的管理思路 跟 很多游戲的房間管理差不多比如斗地主 QQ堂總的來說, 有這么幾點(diǎn)管理規(guī)律只要還有人在用某個對象,那么這個對象就不會被回收只要你想用這個對象,就讓對象的計(jì)數(shù)器+1當(dāng)你不再使用這個對象時,就讓對象的計(jì)數(shù)器-1內(nèi)存管理原則蘋果官方規(guī)定的內(nèi)存管理原則誰創(chuàng)建誰release : 如果你通過alloc、new或mutablecopy來創(chuàng)建一個對象,那么你必須調(diào)用release或autorelease誰retain誰release :只要你調(diào)用了retain,就必須調(diào)用一次release總結(jié)一下就是有
8、加就有減 曾經(jīng)讓對象的計(jì)數(shù)器+1,就必須在最后讓對象計(jì)數(shù)器-1set方法的內(nèi)存管理set方法- (void)setCar:(Car *)car if (car != _car) / 對當(dāng)前正在使用的車(舊車)做一次release _car release; / 對新車做一次retain操作 _car = car retain; dealloc方法的內(nèi)存管理dealloc方法- (void)dealloc / 當(dāng)人不在了,代表不用車了 / 對車做一次release操作 _car release; super dealloc;錯誤寫法下面代碼都會引發(fā)內(nèi)存泄露p.dog = Dog alloc in
9、it;Dog alloc init.weight = 20.8;property參數(shù)控制set方法的內(nèi)存管理retain : release舊值,retain新值(用于OC對象)assign : 直接賦值,不做任何內(nèi)存管理(默認(rèn),用于非OC對象類型)copy : release舊值,copy新值(一般用于NSString *)控制需不需生成set方法readwrite :同時生成set方法和get方法(默認(rèn))readonly :只會生成get方法多線程管理atomic :性能低(默認(rèn))nonatomic :性能高property參數(shù)控制set方法和get方法的名稱setter : 設(shè)置set方
10、法的名稱,一定有個冒號:getter : 設(shè)置get方法的名稱class作用可以簡單地引用一個類簡單使用class Dog;僅僅是告訴編譯器: Dog是一個類; 并不會包含Dog這個類的所有內(nèi)容具體使用在.h文件中使用class引用一個類在.m文件中使用#import包含這個類的.h文件class和#import作用上的區(qū)別#import會包含引用類的所有信息(內(nèi)容), 包括引用類的變量和方法class僅僅是告訴編譯器有這么一個類, 具體這個類里有什么信息, 完全不知效率上的區(qū)別如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動,后
11、面引用到這個文件的所有類都需要重新編譯一遍 , 編譯效率非常低相對來講,使用class方式就不會出現(xiàn)這種問題了 class其他使用場景對于循環(huán)依賴關(guān)系來說,比方A類引用B類,同時B類也引用A類這種嵌套包含的代碼編譯會報(bào)錯 當(dāng)使用class在兩個類相互聲明,就不會出現(xiàn)編譯報(bào)錯#import B.hinterface A : NSObject B *_b;end#import “A.hinterface B : NSObject A *_a;endclass B;interface A : NSObject B *_b;endclass A;interface B : NSObject A *_a
12、;end循環(huán)retian循環(huán)retain的場景比如A對象retain了B對象,B對象retain了A對象循環(huán)retain的弊端這樣會導(dǎo)致A對象和B對象永遠(yuǎn)無法釋放循環(huán)retain的解決方案當(dāng)兩端互相引用時,應(yīng)該一端用retain、一端用assignautorelease簡介autorelease方法的基本作用給對象發(fā)送一條autorelease消息, 會將對象放到一個自動釋放池中當(dāng)自動釋放池被銷毀時,會對池子里面的所有對象做一次release操作會返回對象本身調(diào)用完autorelease方法后,對象的計(jì)數(shù)器不變autorelease的好處不用再關(guān)心對象釋放的時間不用再關(guān)心什么時候調(diào)用relea
13、seautorelease的使用注意占用內(nèi)存較大的對象不要隨便使用autorelease占用內(nèi)存較小的對象使用autorelease,沒有太大影響自動釋放池在iOS程序運(yùn)行過程中,會創(chuàng)建無數(shù)個池子。這些池子都是以棧結(jié)構(gòu)存在(先進(jìn)后出)當(dāng)一個對象調(diào)用autorelease方法時,會將這個對象放到棧頂?shù)尼尫懦刈詣俞尫懦氐膭?chuàng)建方式 iOS 5.0前 NSAutoreleasePool *pool = NSAutoreleasePool alloc init; pool release; / pool drain; iOS 5.0 開始autoreleasepool autorelease的常見錯誤a
14、lloc之后調(diào)用了autorelease,又調(diào)用releasePerson *p = Person alloc init autorelease;p release;連續(xù)調(diào)用多次autoreleasePerson *p = Person alloc init autorelease autorelease;autorelease和release使用對比使用releaseBook *book = Book alloc init;book release;使用autoreleaseBook *book = Book alloc init autorelease;/ 不要再調(diào)用book release;autorelease的應(yīng)用場合一般可以為類添加一個快速創(chuàng)建對象的類方法 + (id)book return self alloc init autorelease;外界調(diào)用Book boo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 園林綠化合同執(zhí)行監(jiān)控案例
- 汽車制造工程師聘用合同范本
- 建筑工程招投標(biāo)部操作流程詳解
- 家具制造廠房建設(shè)合同
- 皮革制品加工廠物料管理操作規(guī)程
- 個人清潔環(huán)衛(wèi)用車租賃協(xié)議
- 碼頭門窗耐鹽霧腐蝕施工合同
- 文化場館建設(shè)圍擋施工合同樣本
- 民宿物業(yè)管理考核辦法
- 業(yè)務(wù)提成協(xié)議書范例
- 血栓彈力圖 (課件)
- 人行梯籠專項(xiàng)施工方案
- 死因監(jiān)測工作總結(jié)
- 邊防知識講座
- 分子病理學(xué)題庫
- 《腎病綜合征》課件
- 護(hù)理給藥制度課件
- 基于單片機(jī)的火災(zāi)報(bào)警系統(tǒng)設(shè)計(jì)
- 培智三年級上冊生活語文期末測試卷(A)
- GB/T 13296-2023鍋爐、熱交換器用不銹鋼無縫鋼管
- 新加坡學(xué)習(xí)匯報(bào)
評論
0/150
提交評論