3.oc加強(qiáng)內(nèi)存管理_第1頁(yè)
3.oc加強(qiáng)內(nèi)存管理_第2頁(yè)
3.oc加強(qiáng)內(nèi)存管理_第3頁(yè)
3.oc加強(qiáng)內(nèi)存管理_第4頁(yè)
3.oc加強(qiáng)內(nèi)存管理_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、內(nèi)存管理講師:李德山內(nèi)存移動(dòng)設(shè)備的內(nèi)存極其有限,每個(gè)app所能占用的內(nèi)存是有限制的 下列行為都會(huì)增加一個(gè)app的內(nèi)存占用創(chuàng)建一個(gè)OC對(duì)象定義一個(gè)變量調(diào)用一個(gè)函數(shù)或者方法當(dāng)app所占用的內(nèi)存較多時(shí),系統(tǒng)會(huì)發(fā)出內(nèi)存警告,這時(shí)得回收一些不需要再使用的內(nèi)存空間。比如回收一些不需要使用的對(duì)象、變量等如果app占用內(nèi)存過大系統(tǒng)可能會(huì)強(qiáng)制關(guān)閉app, 造成閃退現(xiàn)象, 影響用戶體驗(yàn)內(nèi)存管理如何回收那些不需要再使用的對(duì)象?那就得學(xué)會(huì)OC的內(nèi)存管理所謂內(nèi)存管理, 就是對(duì)內(nèi)存進(jìn)行管理, 涉及的操作有:分配內(nèi)存 : 比如創(chuàng)建一個(gè)對(duì)象, 會(huì)增加內(nèi)存占用清除內(nèi)存 : 比如銷毀一個(gè)對(duì)象, 能減小內(nèi)存占用內(nèi)存管理的管理范圍任

2、何繼承了NSObject的對(duì)象對(duì)其他非對(duì)象類型無效(int、char、float、double、struct、enum等 )只有OC對(duì)象才需要進(jìn)行內(nèi)存管理的本質(zhì)原因OC對(duì)象存放于堆里面非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收)內(nèi)存棧內(nèi)存(非OC對(duì)象)堆內(nèi)存(OC對(duì)象)a = 10b = 20地址:0 xffc0Car對(duì)象計(jì)數(shù)器 = 1c = 0 xffc0堆和棧personFfff10Count = 0rFff20Count = 1r2Fff30Count = 0personFfff10Count = 0rFff20Count = 0personrroom_room好悶啊 強(qiáng)烈要求加通

3、風(fēng)口循環(huán)引用Person 0_dogDog0_personpersondog多個(gè)對(duì)象之間不要封閉的環(huán)如出現(xiàn)這個(gè)那么環(huán)中所有對(duì)象都不會(huì)釋放解決方法:其中一端必須是assignA_bB_cD_aC_d什么是引用計(jì)數(shù)器系統(tǒng)是如何判斷 什么時(shí)候需要回收一個(gè)對(duì)象所占用的內(nèi)存?根據(jù)對(duì)象的引用計(jì)數(shù)器什么是引用計(jì)數(shù)器每個(gè)OC對(duì)象都有自己的引用計(jì)數(shù)器它是一個(gè)整數(shù)從字面上, 可以理解為”對(duì)象被引用的次數(shù)”也可以理解為: 它表示有多少人正在用這個(gè)對(duì)象OC對(duì)象4字節(jié) 引用計(jì)數(shù)器每個(gè)OC對(duì)象內(nèi)部都有4個(gè)字節(jié)的存儲(chǔ)空間來存放引用計(jì)數(shù)器引用計(jì)數(shù)器的作用簡(jiǎn)單來說, 可以理解為: 引用計(jì)數(shù)器表示有多少人正在使用這個(gè)對(duì)象當(dāng)沒有任

4、何人使用這個(gè)對(duì)象時(shí), 系統(tǒng)才會(huì)回收這個(gè)對(duì)象, 也就是說當(dāng)對(duì)象的引用計(jì)數(shù)器為0時(shí), 對(duì)象占用的內(nèi)存就會(huì)被系統(tǒng)回收如果對(duì)象的計(jì)數(shù)器不為0,那么在整個(gè)程序運(yùn)行過程,它占用的內(nèi)存就不可能被回收(除非整個(gè)程序已經(jīng)退出 )任何一個(gè)對(duì)象, 剛生下來的時(shí)候, 引用計(jì)數(shù)器都為1當(dāng)使用alloc、new或者copy創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象的引用計(jì)數(shù)器 + 1 引用計(jì)數(shù)器的操作要想管理對(duì)象占用的內(nèi)存, 就得學(xué)會(huì)操作對(duì)象的引用計(jì)數(shù)器引用計(jì)數(shù)器的常見操作給對(duì)象發(fā)送一條retain消息, 可以使引用計(jì)數(shù)器值+1(retain方法返回對(duì)象本身)給對(duì)象發(fā)送一條release消息, 可以使引用計(jì)數(shù)器值-1給對(duì)象發(fā)送retainCo

5、unt消息, 可以獲得當(dāng)前的引用計(jì)數(shù)器值需要注意的是: release并不代表銷毀回收對(duì)象, 僅僅是計(jì)數(shù)器-1dealloc當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器值為0時(shí)這個(gè)對(duì)象即將被銷毀,其占用的內(nèi)存被系統(tǒng)回收系統(tǒng)會(huì)自動(dòng)給對(duì)象發(fā)送一條dealloc消息(因此, 從dealloc方法有沒有被調(diào)用, 就可以判斷出對(duì)象是否被銷毀)dealloc方法的重寫一般會(huì)重寫dealloc方法, 在這里釋放相關(guān)資源, dealloc就是對(duì)象的遺言一旦重寫了dealloc方法, 就必須調(diào)用super dealloc,并且放在最后面調(diào)用使用注意不能直接調(diào)用dealloc方法一旦對(duì)象被回收了, 它占用的內(nèi)存就不再可用, 堅(jiān)持使用會(huì)

6、導(dǎo)致程序崩潰(野指針錯(cuò)誤) 野指針空指針僵尸對(duì)象已經(jīng)被銷毀的對(duì)象(不能再使用的對(duì)象)野指針指向僵尸對(duì)象(不可用內(nèi)存)的指針給野指針發(fā)消息會(huì)報(bào)EXC_BAD_ACCESS錯(cuò)誤空指針沒有指向存儲(chǔ)空間的指針(里面存的是nil, 也就是0)給空指針發(fā)消息是沒有任何反應(yīng)的為了避免野指針錯(cuò)誤的常見辦法在對(duì)象被銷毀之后, 將指向?qū)ο蟮闹羔樧優(yōu)榭罩羔橁P(guān)閉ARC功能要想手動(dòng)調(diào)用retain、release等方法 , 就必須關(guān)閉ARC功能開啟僵尸對(duì)象監(jiān)控默認(rèn)情況下,Xcode是不會(huì)管僵尸對(duì)象的,使用一塊被釋放的內(nèi)存也不會(huì)報(bào)錯(cuò)。為了方便調(diào)試,應(yīng)該開啟僵尸對(duì)象監(jiān)控多對(duì)象內(nèi)存管理單個(gè)對(duì)象的內(nèi)存管理, 看起來非常簡(jiǎn)單如果

7、對(duì)多個(gè)對(duì)象進(jìn)行內(nèi)存管理, 并且對(duì)象之間是有聯(lián)系的, 那么管理就會(huì)變得比較復(fù)雜其實(shí), 多個(gè)對(duì)象的管理思路 跟 很多游戲的房間管理差不多比如斗地主 QQ堂總的來說, 有這么幾點(diǎn)管理規(guī)律只要還有人在用某個(gè)對(duì)象,那么這個(gè)對(duì)象就不會(huì)被回收只要你想用這個(gè)對(duì)象,就讓對(duì)象的計(jì)數(shù)器+1當(dāng)你不再使用這個(gè)對(duì)象時(shí),就讓對(duì)象的計(jì)數(shù)器-1內(nèi)存管理原則蘋果官方規(guī)定的內(nèi)存管理原則誰創(chuàng)建誰release : 如果你通過alloc、new或mutablecopy來創(chuàng)建一個(gè)對(duì)象,那么你必須調(diào)用release或autorelease誰retain誰release :只要你調(diào)用了retain,就必須調(diào)用一次release總結(jié)一下就是有

8、加就有減 曾經(jīng)讓對(duì)象的計(jì)數(shù)器+1,就必須在最后讓對(duì)象計(jì)數(shù)器-1set方法的內(nèi)存管理set方法- (void)setCar:(Car *)car if (car != _car) / 對(duì)當(dāng)前正在使用的車(舊車)做一次release _car release; / 對(duì)新車做一次retain操作 _car = car retain; dealloc方法的內(nèi)存管理dealloc方法- (void)dealloc / 當(dāng)人不在了,代表不用車了 / 對(duì)車做一次release操作 _car release; super dealloc;錯(cuò)誤寫法下面代碼都會(huì)引發(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對(duì)象)assign : 直接賦值,不做任何內(nèi)存管理(默認(rèn),用于非OC對(duì)象類型)copy : release舊值,copy新值(一般用于NSString *)控制需不需生成set方法readwrite :同時(shí)生成set方法和get方法(默認(rèn))readonly :只會(huì)生成get方法多線程管理atomic :性能低(默認(rèn))nonatomic :性能高property參數(shù)控制set方法和get方法的名稱setter : 設(shè)置set方

10、法的名稱,一定有個(gè)冒號(hào):getter : 設(shè)置get方法的名稱class作用可以簡(jiǎn)單地引用一個(gè)類簡(jiǎn)單使用class Dog;僅僅是告訴編譯器: Dog是一個(gè)類; 并不會(huì)包含Dog這個(gè)類的所有內(nèi)容具體使用在.h文件中使用class引用一個(gè)類在.m文件中使用#import包含這個(gè)類的.h文件class和#import作用上的區(qū)別#import會(huì)包含引用類的所有信息(內(nèi)容), 包括引用類的變量和方法class僅僅是告訴編譯器有這么一個(gè)類, 具體這個(gè)類里有什么信息, 完全不知效率上的區(qū)別如果有上百個(gè)頭文件都#import了同一個(gè)文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動(dòng),后

11、面引用到這個(gè)文件的所有類都需要重新編譯一遍 , 編譯效率非常低相對(duì)來講,使用class方式就不會(huì)出現(xiàn)這種問題了 class其他使用場(chǎng)景對(duì)于循環(huán)依賴關(guān)系來說,比方A類引用B類,同時(shí)B類也引用A類這種嵌套包含的代碼編譯會(huì)報(bào)錯(cuò) 當(dāng)使用class在兩個(gè)類相互聲明,就不會(huì)出現(xiàn)編譯報(bào)錯(cuò)#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的場(chǎng)景比如A對(duì)象retain了B對(duì)象,B對(duì)象retain了A對(duì)象循環(huán)retain的弊端這樣會(huì)導(dǎo)致A對(duì)象和B對(duì)象永遠(yuǎn)無法釋放循環(huán)retain的解決方案當(dāng)兩端互相引用時(shí),應(yīng)該一端用retain、一端用assignautorelease簡(jiǎn)介autorelease方法的基本作用給對(duì)象發(fā)送一條autorelease消息, 會(huì)將對(duì)象放到一個(gè)自動(dòng)釋放池中當(dāng)自動(dòng)釋放池被銷毀時(shí),會(huì)對(duì)池子里面的所有對(duì)象做一次release操作會(huì)返回對(duì)象本身調(diào)用完autorelease方法后,對(duì)象的計(jì)數(shù)器不變autorelease的好處不用再關(guān)心對(duì)象釋放的時(shí)間不用再關(guān)心什么時(shí)候調(diào)用relea

13、seautorelease的使用注意占用內(nèi)存較大的對(duì)象不要隨便使用autorelease占用內(nèi)存較小的對(duì)象使用autorelease,沒有太大影響自動(dòng)釋放池在iOS程序運(yùn)行過程中,會(huì)創(chuàng)建無數(shù)個(gè)池子。這些池子都是以棧結(jié)構(gòu)存在(先進(jìn)后出)當(dāng)一個(gè)對(duì)象調(diào)用autorelease方法時(shí),會(huì)將這個(gè)對(duì)象放到棧頂?shù)尼尫懦刈詣?dòng)釋放池的創(chuàng)建方式 iOS 5.0前 NSAutoreleasePool *pool = NSAutoreleasePool alloc init; pool release; / pool drain; iOS 5.0 開始autoreleasepool autorelease的常見錯(cuò)誤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使用對(duì)比使用releaseBook *book = Book alloc init;book release;使用autoreleaseBook *book = Book alloc init autorelease;/ 不要再調(diào)用book release;autorelease的應(yīng)用場(chǎng)合一般可以為類添加一個(gè)快速創(chuàng)建對(duì)象的類方法 + (id)book return self alloc init autorelease;外界調(diào)用Book boo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論