溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Objective中的autorelease怎么理解

發(fā)布時(shí)間:2021-12-30 16:48:05 來(lái)源:億速云 閱讀:116 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“Objective中的autorelease怎么理解”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

如果你能夠真正的理解autorelease,那么你才是理解了Objective c的內(nèi)存管理。Autorelease實(shí)際上只是把對(duì)release的調(diào)用延遲了,對(duì)于每一個(gè)Autorelease,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中,當(dāng)該pool被釋放時(shí),該pool中的所有Object會(huì)被調(diào)用Release。

[1]在Iphone項(xiàng)目中,大家會(huì)看到一個(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è)Autorelease pool,這樣所有的release pool會(huì)構(gòu)成一個(gè)象CallStack一樣的一個(gè)棧式結(jié)構(gòu),在每一個(gè)Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)腁utorelease pool會(huì)被銷毀,這樣這個(gè)pool里的每個(gè)Object會(huì)被release。

那什么是一個(gè)Runloop呢? 一個(gè)UI事件,Timer call, delegate call, 都會(huì)是一個(gè)新的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)過(guò)來(lái)的程序員會(huì)說(shuō),這個(gè)auto release有什么好,象C/C++那樣,自己申請(qǐng),自己釋放,完全可控不好么, 這個(gè)auto relase 完全不可控,你都不知到它什么時(shí)候會(huì)被真正的release。我的理解它有一個(gè)作用就是可以做到每個(gè)函數(shù)對(duì)自己申請(qǐng)的對(duì)象負(fù)責(zé),自己申請(qǐng),自己釋放,該函數(shù)的調(diào)用者不需要關(guān)心它內(nèi)部申請(qǐng)對(duì)象的管理。  在下面這個(gè)例子中,F(xiàn)unc1的調(diào)用者不需要再去關(guān)心obj的釋放。

ClassA *Func1()  {    ClassA *obj = [[[ClassA alloc]init]autorelease];    return obj;  }

實(shí)際上對(duì)于 [NSString stringWithFormat:] 這類構(gòu)造函數(shù)返回的對(duì)象都是autorelease的。

2.2) autorelease pool來(lái)避免頻繁申請(qǐng)/釋放內(nèi)存(就是pool的作用了)。這個(gè)應(yīng)該是相對(duì)比較好理解的。

總結(jié):1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在對(duì)象被釋放后使用。

2)[NSString stringWithFormat:]這類函數(shù)返回的對(duì)象是不需要再自己release的,它已經(jīng)被autorelease了, 如果你想把它當(dāng)一個(gè)全局對(duì)象使用,那必須自己再retain, 釋放時(shí)再release。

“Objective中的autorelease怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI