Objective C内存管理之理解autorelease------面试题
Objective C內(nèi)存管理之理解autorelease
?Autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調(diào)用Release。
[1]在Iphone項目中,大家會看到一個默認的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é)束時,當前棧頂?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被加如當前的AutoreleaePool。? ?
- }?
[2]為什么需要Auto release ?
2.1)作用就是可以做到每個函數(shù)對自己申請的對象負責,自己申請,自己釋放,該函數(shù)的調(diào)用者不需要關(guān)心它內(nèi)部申請對象的管理。?
在下面這個例子中,Func1的調(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的作用了)。這個應該是相對比較好理解的。
總結(jié):1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在對象被釋放后使用。
2)[NSString stringWithFormat:]這類函數(shù)返回的對象是不需要再自己release的,它已經(jīng)被autorelease了, 如果你想把它當一個全局對象使用,那必須自己再retain, 釋放時再release。
?
轉(zhuǎn)載于:https://www.cnblogs.com/iOS-mt/p/4175869.html
總結(jié)
以上是生活随笔為你收集整理的Objective C内存管理之理解autorelease------面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS中C#读取app.config数据库
- 下一篇: 不闻其声下一句是什么呢?