日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
iOS優(yōu)化內(nèi)存,提升性能之五

Advanced Autorelease Pool 高級自動釋放池

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、南漳網(wǎng)絡(luò)推廣、微信小程序開發(fā)、南漳網(wǎng)絡(luò)營銷、南漳企業(yè)策劃、南漳品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供南漳建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

在之前的章節(jié)你已經(jīng)學(xué)習(xí)了很多基本的內(nèi)存方面的知識。這個部分將會涉及到使用自動釋放的高級技術(shù),同時展示你應(yīng)該在哪里使用,從而在受限的情況下獲得比較高的性能。

在每一個線程中,你應(yīng)該要有一個自動釋放池來收集和存儲所有自動釋放的對象。如果在每一個線程中,沒有自動釋放池的話,所有的autoreleased對象會泄露,你將會有一個重大的內(nèi)存泄露。自動釋放池是通過棧的形式組織在一起的;下面部分會解釋。

自動釋放池和棧

自動釋放池存儲在一個棧中,通常被理解成嵌套的。無論何時你創(chuàng)建一個新的自動釋放池,它都會被push到棧的頂部。然后所有新的autoreleased對象會被push到這個新的自動釋放池中。

通過下面的代碼你可以看到,對象(比如myArray和myString)內(nèi)部的方法doSomething將會存儲在myPool中,而不是應(yīng)用的main pool中:

- (void)doSomething {

   @autoreleasepool {

           NSArray *myArray = [NSArray array];

           NSString *myString = [NSString string];

     }

}


這是main方法的main pool:


int main(int argc, char *argv[]){

   @autoreleasepool {
           int retVal = UIApplicationMain(argc, argv, nil, nil);

     }

   return retVal;

}

在@autoreleasepool塊結(jié)束的時候,當(dāng)時間生命周期結(jié)束時,所有存儲在這個pool中的autoreleased對象jiang將被released。


圖7-9展示了這個概念。對于一個好的性能來說,這是一個非常重要的概念 --  知道盡可能快的release對象。


iOS優(yōu)化內(nèi)存,提升性能 之五

自動釋放池和線程

當(dāng)創(chuàng)建一個新的線程時,你需要創(chuàng)建一個新的自動釋放池對象,然后將這個pool和新的線程聯(lián)系在一起。因此當(dāng)線程停止時,你的自動釋放池會deallocated,所有的autoreleased對象也會deallocated。第6章我會深入的討論這個主題,所以你應(yīng)該復(fù)習(xí)一下,如果你在理解概念時需要一些幫助的話。

自動釋放池對性能的影響

舊的內(nèi)存管理規(guī)則依然能夠應(yīng)用在用ARC編寫的代碼上,如果你沒有使用new,alloc和copy調(diào)用一個方法,這個對象就已經(jīng)是autoreleased了。如果你在一個循環(huán)中創(chuàng)建了很多的autoreleased對象,很快內(nèi)存就會耗盡。

這個代碼演示了在循環(huán)中處理內(nèi)存管理最好的方法:

- (void)doSomethingWithAutoRelease {

       for (int i = 0; i < 1000; i++) {

               @autoreleasepool {
                Product *product = [Product productWithItemID:@""];

                // process and display the product here

               }

       }

}

在循環(huán)結(jié)束的時候,以及在@autoreleasepool塊的尾部,所有的autoreleased對象會released。這種方法你能夠控制和release所有位使用的對象和回收你的內(nèi)存。



Instruments

當(dāng)我討論使用設(shè)備和模擬器測試的時候,第2章已經(jīng)介紹過Instruments。在這個部分,我將簡短的討論一些更加更高級的問題,這些問題會影響到你應(yīng)該選擇什么樣的內(nèi)存管理方式。

大部分時間,你需要使用到4中主要的instruments。

  • Static Analyzer

  • Leaks Instruments

  • Zombie

  • Object allocation

Static Analyzer

static Analyzer是一個比較快速的方法檢查一些微小的比較明顯的內(nèi)存泄露。例如,如果你alloc了一個新的對象,沒有在方法內(nèi)release它,如圖7-10所示,Static Analyzer能夠快速的發(fā)現(xiàn)。

iOS優(yōu)化內(nèi)存,提升性能 之五

Leak Instrument

Leaks Instrument更加復(fù)雜,它需要時間允許和分析,但是會給出更好的結(jié)果。在運行過程中,它能夠檢測到所有數(shù)據(jù)軌跡的內(nèi)存泄露。

iOS優(yōu)化內(nèi)存,提升性能 之五

Leaks Instrument能給出內(nèi)存泄露對象更多的細(xì)節(jié)信息,如圖7-11.

iOS優(yōu)化內(nèi)存,提升性能 之五

同樣能夠顯示泄露確切的發(fā)生在哪一行(圖 7-12)。

Zombie

Zombie能夠幫助你檢查EXEC_BAD_ACCESS導(dǎo)致的應(yīng)用程序崩潰的問題。這是非常有幫助的,如果你的應(yīng)用老是崩潰,但是通過日志或檢查代碼又發(fā)現(xiàn)不了問題的話。

如圖7-13,Zombie會顯示給你一個actions的list,包括malloc,autorelease,retain,和release,當(dāng)應(yīng)用崩潰的時候。你使用Zombie跟蹤autorelease和release方法。

iOS優(yōu)化內(nèi)存,提升性能 之五

Object Allocation

Object allocation是我要介紹的內(nèi)存相關(guān)的最后一個工具。它顯示了運行過程中,所有內(nèi)存的使用情況。這個工具是非常有用的,當(dāng)內(nèi)存使用增長很多,你需要跟蹤使用內(nèi)存較多的那些代碼。

iOS優(yōu)化內(nèi)存,提升性能 之五

圖7-14顯示了代碼所在行,對象創(chuàng)建的時間,和創(chuàng)建對象的調(diào)用者。

Memory Waring Levels

最后我要討論的是關(guān)于內(nèi)存警告。當(dāng)你的內(nèi)存增長到一定點時,iOS系統(tǒng)會嘗試告訴你,通過在view controller中調(diào)用didReceiveWarning方法。你應(yīng)該在這個方法中釋放一些內(nèi)存。

注意:在你的應(yīng)用中還有其他方法收到內(nèi)存警告:applocation delegate收到內(nèi)存警告,然后在其他對象中調(diào)用相應(yīng)的方法,或者你的對象通過NSNotification注冊了接受內(nèi)存警告的通知。

內(nèi)存警告的第1級別是最重要的:它意味著你的代碼已經(jīng)快速的使用了很多內(nèi)存。否則,你的app將會收到第2個級別的警告,然后會崩潰。

總結(jié)

內(nèi)存對你的app的性能有重要影響。如果你不恰當(dāng)?shù)氖褂脮?dǎo)致你的app崩潰。在本章,你學(xué)到了在objective-c中很多關(guān)于內(nèi)存管理方面的重要概念,這能夠幫助你避免內(nèi)存泄露和應(yīng)用程序崩潰。UIViewController的生命周期同樣非常重要,因為它和內(nèi)存的管理和控制有關(guān)。它同樣會影響到應(yīng)用的性能和體驗。最后,你學(xué)到了當(dāng)在處理內(nèi)存時,autorelease和release的不同,以及何時應(yīng)該用其中的一個替代另外一個。


分享題目:iOS優(yōu)化內(nèi)存,提升性能之五
瀏覽路徑:http://www.dlmjj.cn/article/jdshcs.html