版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年水保項(xiàng)目水資源優(yōu)化配置咨詢合同3篇
- 二零二五年度新能源技術(shù)開發(fā)與合作合同
- 泰州市2025年度存量房買賣合同樣本2篇
- 二零二五年房屋買賣過戶合同續(xù)約范本5篇
- 2025年行政單位土地資源轉(zhuǎn)讓合同范本3篇
- 二零二五年度礦區(qū)復(fù)綠分包合同4篇
- 二零二五年度綠化帶維護(hù)服務(wù)合同4篇
- 2024版離婚后房產(chǎn)權(quán)益分配合同版B版
- 2025年溫室大棚蔬菜種植項(xiàng)目風(fēng)險(xiǎn)管理咨詢合同3篇
- 2025版綠色能源項(xiàng)目租賃及運(yùn)營服務(wù)合同4篇
- 常用靜脈藥物溶媒的選擇
- 2023-2024學(xué)年度人教版一年級(jí)語文上冊(cè)寒假作業(yè)
- 當(dāng)代西方文學(xué)理論知到智慧樹章節(jié)測(cè)試課后答案2024年秋武漢科技大學(xué)
- 2024年預(yù)制混凝土制品購銷協(xié)議3篇
- 2024-2030年中國高端私人會(huì)所市場(chǎng)競(jìng)爭格局及投資經(jīng)營管理分析報(bào)告
- GA/T 1003-2024銀行自助服務(wù)亭技術(shù)規(guī)范
- 《消防設(shè)備操作使用》培訓(xùn)
- 新交際英語(2024)一年級(jí)上冊(cè)Unit 1~6全冊(cè)教案
- 2024年度跨境電商平臺(tái)運(yùn)營與孵化合同
- 2024年電動(dòng)汽車充電消費(fèi)者研究報(bào)告-2024-11-新能源
- 湖北省黃岡高級(jí)中學(xué)2025屆物理高一第一學(xué)期期末考試試題含解析
評(píng)論
0/150
提交評(píng)論