技術(shù)狗傳智播客ios開發(fā)零基礎(chǔ)教程源代碼和-07-內(nèi)存管理_第1頁
技術(shù)狗傳智播客ios開發(fā)零基礎(chǔ)教程源代碼和-07-內(nèi)存管理_第2頁
技術(shù)狗傳智播客ios開發(fā)零基礎(chǔ)教程源代碼和-07-內(nèi)存管理_第3頁
技術(shù)狗傳智播客ios開發(fā)零基礎(chǔ)教程源代碼和-07-內(nèi)存管理_第4頁
技術(shù)狗傳智播客ios開發(fā)零基礎(chǔ)教程源代碼和-07-內(nèi)存管理_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

內(nèi)存管理范圍:任何繼承了NSObject的對(duì)象,對(duì)基本數(shù)據(jù)類型無效都保存了一個(gè)與之相關(guān)聯(lián)的整數(shù),稱為、ew或者copy創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象的原理:每個(gè)對(duì)象當(dāng)使用被設(shè)置為1計(jì)數(shù)器計(jì)數(shù)器計(jì)數(shù)器值+1計(jì)數(shù)器值-1給對(duì)象發(fā)送一條retain消息,可以使給對(duì)象發(fā)送一條release消息,可以使當(dāng)一個(gè)對(duì)象的

計(jì)數(shù)器值為0時(shí),那么它將被銷毀,其占用的內(nèi)存被系統(tǒng)回收,系統(tǒng)也會(huì)自對(duì)象發(fā)送一條dealloc消息。一般會(huì)相關(guān)資源。一定不要直接調(diào)用重寫dealloc方法,在這里dealloc方法可以給對(duì)象發(fā)送retainCount消息獲得當(dāng)前的

計(jì)數(shù)器值內(nèi)存管理原則1.誰創(chuàng)建,誰(“誰污染,誰治理”)。如果你通過、ew或(mutable)copy來創(chuàng)建一個(gè)對(duì)象,那么你必須調(diào)用release或autorelease。換句話說,不是你創(chuàng)建的,就不用你去一般來說除了、ew或copy之外的方法創(chuàng)建的對(duì)象都被了autorelease3.誰retain,誰release。只要你調(diào)用了retain,無論這個(gè)對(duì)象是如何生成的,你都要調(diào)用releaseStudent.h#import

<Foundation/Foundation.h>#import

"Book.h"@interfaceStudent@property

Book

*book;@endStudent.m#import

"Student.h"@implementation

Student@synthesize

book

=_book;(void)setBook:(Book

*)book{if

(book

!=

_book)

{[_bookrelease];_book

=

[book

retain];}}(void)dealloc

{[_book

release];[superdealloc];}@end@class通常 一個(gè)類有兩種辦法一種是通過#import方式引一種是通過@class引入兩種方式的區(qū)別:1、#import方式會(huì)包含被 類的所有信息,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中

B*b

只是類的 ,具體這個(gè)類里有什么信息,這里不需要知道,等實(shí)現(xiàn)文件中真正要用到時(shí),才會(huì)真正去查看B類中信息@class2、使用@class方式由于只需要知道被類(B類)的名稱就可以了,而在實(shí)現(xiàn)類由于要用到被類中的實(shí)體變量和方法,所以在.m文件中需要使用#import來包含被 類的頭文件3、如果有上百個(gè)頭文件都#import了同一個(gè)文件,或者這些文件依次被#improt,那么一旦最開始的頭文件稍有改動(dòng),后面到這個(gè)文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對(duì)來講,使用@class方式就不會(huì)出現(xiàn)這種問題了@class4、對(duì)于循環(huán)依賴關(guān)系來說,比方A類

B類,同時(shí)B類也引用A類,B類的代碼:當(dāng)程序運(yùn)行時(shí),編譯會(huì)報(bào)錯(cuò)。當(dāng)使用@class在兩個(gè)類相互 ,就不會(huì)出現(xiàn)編譯報(bào)錯(cuò)。由上可知,@class是放在.h中的,只是在

一個(gè)類,將這個(gè)被

類作為一個(gè)類型,在.m實(shí)現(xiàn)文件中,如果需要

到被

類的實(shí)體變量或者方法時(shí),還需要使用#import方式引入被

類。Student.h改進(jìn)#import

<Foundation/Foundation.h>@class

Book;@interfaceStudent@property

(retain)

Book

*book;@endStudent.m改進(jìn)#import

"Student.h"#import

"Book.h"@implementationStudent//@synthesize會(huì)自動(dòng)展開setter和getter,隱藏了內(nèi)存管理細(xì)節(jié)@synthesize

book

=

_book;-

(void)dealloc

{[_book

release];[super

dealloc];}@end自動(dòng) 池(autorelease

pool)自動(dòng) 池是OC里面的一種內(nèi)存自動(dòng)回收機(jī)制,一般可以將一些臨時(shí)變量添加到自動(dòng) 池中,

回收釋放當(dāng)自動(dòng)

池銷毀時(shí),池里面的所有對(duì)象都會(huì)調(diào)用一次release方法autoreleaseOC對(duì)象只需要發(fā)送一條autorelease消息,就會(huì)把這個(gè)對(duì)象添加到最近的自動(dòng) 池中(棧頂?shù)?池)autorelease實(shí)際上只是把對(duì)release的調(diào)用延遲了,對(duì)于每一次autorelease,系統(tǒng)只是把該對(duì)象放入了當(dāng)前的autorelease

pool中,當(dāng)該pool被 時(shí),該pool中的所有對(duì)象會(huì)被調(diào)用Release自動(dòng)池的創(chuàng)建ios5.0后@autoreleasepool{//....}ios5.0前NSAutoreleasePool

*pool

=

[[NSAutoreleasePool

alloc]init];//

.....[poolrelease];//或[pool

drain];使用autorelease以前:Book*book=[[Book

alloc]init];[studentsetBook:book];[book

release];現(xiàn)在:Book

*book=

[[[Book

alloc]

init]autorelease];[studentsetBook:book];//不要再調(diào)用[book

release];使用autorelease返一般可以為類添加一個(gè)快速創(chuàng)建對(duì)象的靜態(tài)方法+(id)book

{return

[[[Book

alloc]

init]

autorelease];}外界調(diào)用[Book

book]時(shí),根本不用考慮在什么時(shí)候回的Book對(duì)象autorelease

pool疑問在項(xiàng)目中,main()中有一個(gè)默認(rèn)的Autorelease

Pool,程序開始時(shí)創(chuàng)建,程序退出時(shí)銷毀,按照對(duì)Autorelease的理解,豈不是Autorelease

Pool里的所有對(duì)象在程序退出時(shí)才release,這樣跟內(nèi)存有什么區(qū)別?對(duì)于每一個(gè)Runloop,系統(tǒng)會(huì)隱式創(chuàng)建一個(gè)Autoreleasepool,并且把創(chuàng)建好的pool放在棧頂,所有的pool會(huì)構(gòu)成一個(gè)棧式結(jié)構(gòu)。在每一個(gè)

Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)膒ool會(huì)被銷毀,這樣這個(gè)pool里的每個(gè)對(duì)象會(huì)執(zhí)行release操作autorelease

pool注意1.

在ARC下,不能使用[[NSAutoreleasePool

alloc]init],而應(yīng)當(dāng)使用@autoreleasepool2.大量循環(huán)操作放到同一個(gè)NSAutoreleasePool之間,這樣會(huì)造成內(nèi)存峰值的上升機(jī)制,還是盡盡量避免對(duì)大內(nèi)存使用該方法,對(duì)于這種延遲量少用sdk中一般利用靜態(tài)方法創(chuàng)建并返回的對(duì)象都是已經(jīng)autorelease的,不需要再進(jìn)行release操作如[NSNumber

numberWithInt:10];返回的對(duì)象是不需要再release的。但是通過[[NSNumber

alloc]initWithInt:10]創(chuàng)建的對(duì)象需要release@property格式:@property(參數(shù)1,參數(shù)2)類型名字;參數(shù)可有可無,比如:@property

int

age;@property(nonatomic,retain)

UIButton*

btn;參數(shù)主要分為3類讀寫屬性:readwrite/readonlysetter處理:assign/retain/copy原子性:atomic/nonatomic@property參數(shù)-atomic@property屬性默認(rèn)為atomic,提供多線程安全在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果加了atomic,setter/getter是一個(gè)原子操作。如果有多個(gè)線程同時(shí)調(diào)用setter的話,不會(huì)出現(xiàn)某一個(gè)線程執(zhí)行

setter全部語句之前,另一個(gè)線程開始執(zhí)行setter的情況,相當(dāng)于函數(shù)頭尾加了鎖一樣@property參數(shù)-nonatomic多線程,變量保護(hù),提高性能atomic是OC使用的一種線程保護(hù)技術(shù),防止在寫入未完成的時(shí)候被另外一個(gè)線程 ,造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在 這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇如果不需要多線程支持的話,用nonatomic就夠了,另外由于不涉及鎖操作,所以它執(zhí)行相對(duì)快點(diǎn)@property其他參數(shù)readwrite:產(chǎn)生setter\getterreadonly:只產(chǎn)生簡單的getter,沒有setter。assign:默認(rèn)類型,setter方法直接賦值,而不進(jìn)行retain操作retain:setter方法release舊值,再retain新值copy:setter方法release舊值,再copy新值循環(huán)分析下面一種情景:(假設(shè)都是retain

)對(duì)象A

了對(duì)象B,對(duì)象B

了對(duì)象C,對(duì)象C了對(duì)象B.計(jì)數(shù)分別是2和1.當(dāng)A不再使用B,調(diào)用release這時(shí)候B和C的,因?yàn)镃還對(duì)B的所了B,所以B的 計(jì)數(shù)為1,B不會(huì)被 。B不

,C的

計(jì)數(shù)就是1,C也不會(huì)被 。從此,B和C

留在內(nèi)存中,B和C互相時(shí),應(yīng)該一端使用ratain,另一端為了打斷上面這種循環(huán)使用assignARC(Automatic

Reference

Counting)ARC,就是由編譯器代碼中自動(dòng)加入了retain/release。要注意的是,ARC并不是GC,它只是一種代碼靜態(tài)分析工具從iOS5/Mac

OS

X10.7開始導(dǎo)入,利用Xcode4.2可以使用該機(jī)制優(yōu)點(diǎn):不需要擔(dān)心煩人的內(nèi)存管理和內(nèi)存代碼的總量變少了代碼效率高,由于使用編譯器管理缺點(diǎn):要記住新的ARC規(guī)則、關(guān)鍵字、特性計(jì)數(shù),減少了低效代碼的可能性使用一些舊代碼、第

代碼的時(shí)候比較麻煩,可能要修改編譯開關(guān),XCode

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論