本篇內(nèi)容介紹了“Objective中的autorelease怎么理解”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)致力于做網(wǎng)站、成都網(wǎng)站設(shè)計,成都網(wǎng)站設(shè)計,集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
如果你能夠真正的理解autorelease,那么你才是理解了Objective c的內(nèi)存管理。Autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中,當(dāng)該pool被釋放時,該pool中的所有Object會被調(diào)用Release。
[1]在Iphone項目中,大家會看到一個默認(rèn)的Autorelease pool,程序開始時創(chuàng)建,程序退出時銷毀,按照對Autorelease的理解,豈不是所有autorelease pool里的對象在程序退出時才release, 這樣跟內(nèi)存泄露有什么區(qū)別?
答案是,對于每一個Runloop, 系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構(gòu)成一個象CallStack一樣的一個棧式結(jié)構(gòu),在每一個Runloop結(jié)束時,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀,這樣這個pool里的每個Object會被release。
那什么是一個Runloop呢? 一個UI事件,Timer call, delegate call, 都會是一個新的Runloop。例子如下:
NSString* globalObject; - (void)applicationDidFinishLaunching:(UIApplication *)application { globalObject = [[NSString alloc] initWithFormat:@"Test"]; NSLog(@"Retain count after create: %d", [globalObject retainCount]); // output 1. [globalObject retain]; NSLog(@"Retain count after retain: %d", [globalObject retainCount]); // output 2. } - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]); // 輸出1. Button click loop finished, it's autorelease pool released, globalObject get released once. } -(IBAction)onButtonClicked { [globalObject autorelease]; NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]); // 輸出2。 Autorelease被call, globalObject被加如當(dāng)前的AutoreleaePool。 }
[2]為什么需要Auto release ?
2.1)很多C/C++轉(zhuǎn)過來的程序員會說,這個auto release有什么好,象C/C++那樣,自己申請,自己釋放,完全可控不好么, 這個auto relase 完全不可控,你都不知到它什么時候會被真正的release。我的理解它有一個作用就是可以做到每個函數(shù)對自己申請的對象負(fù)責(zé),自己申請,自己釋放,該函數(shù)的調(diào)用者不需要關(guān)心它內(nèi)部申請對象的管理。 在下面這個例子中,F(xiàn)unc1的調(diào)用者不需要再去關(guān)心obj的釋放。
ClassA *Func1() { ClassA *obj = [[[ClassA alloc]init]autorelease]; return obj; }
實際上對于 [NSString stringWithFormat:] 這類構(gòu)造函數(shù)返回的對象都是autorelease的。
2.2) autorelease pool來避免頻繁申請/釋放內(nèi)存(就是pool的作用了)。這個應(yīng)該是相對比較好理解的。
總結(jié):1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在對象被釋放后使用。
2)[NSString stringWithFormat:]這類函數(shù)返回的對象是不需要再自己release的,它已經(jīng)被autorelease了, 如果你想把它當(dāng)一個全局對象使用,那必須自己再retain, 釋放時再release。
“Objective中的autorelease怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!