objective-c記憶體管理模組

來源:互聯網
上載者:User

標籤:

objective-c可以全自動的實現程式的記憶體管理,主要是依賴於objective-c中引用計數的管理機制

首先:

記憶體管理的準則是:如果對一個對象使用了A類. alloc,[mutable]copy[withZone],retaion那麼你必須使用相應的B類.release 或者 autorelease

解釋:即每次程式中使用了A類的關鍵字,就需要對應使用B類的關鍵字釋放對象記憶體。

 

1.數組的記憶體管理

一個對象聲明,該對象的retainCount = 1;當將該對象添加到一個可變數組中的時候,對應的對象的retainCount會增加1。為什麼呢?原因是當對象添加到數組中,該數組的該元素就會獲得這個對象的所有權。所以該對象的引用計數就會增加一。當數組被release調時候,遍曆數組中的每一個元素,將每一個元素都release一次,這樣保證了對象被釋放乾淨。

NSMutableArray *dogList= [[NSMutableArray alloc] init]; //dogList -->retainCount = 1Dog *dog1 = [[Dog alloc] init]; //dog1  --retainCount = 1//將dog1添加到dogList中[dogList addObject:dog1];  //dog1  --retainCount = 2[dogList addObject:dog1];  //dog1  --retainCount = 3[dog1 release];  //--->retainCount 2 減一[dogList release]; //釋放dogList本身,及每一個其中的元素都有被release

擴充:關鍵字@autoreleasepool一個自動釋放池,其工作原理類似於一個數組,當你講對象以方法autorelease時[dog1 autorelease],編譯器會自動將該對象添加到一個數組中,再release該對象,等程式結束後,就會自動release數組內的所有對象。

 

2.字串的記憶體管理

字串對象記憶體管理從引用計數上是很難把握的。

當以:如下的代碼,你會驚奇的發現:retainCount = -1; 這又是為什麼呢?

 1 NSString *str1 = [[NSString alloc] initWithString:@"hello world"]; 2 NSLog(@"retainCount1 = %li",str1.retainCount);  //retainCount -1 3 [str1 release]; 4          5          6 NSString *str2 = [NSString stringWithString:str1]; 7 NSLog(@"retainCount2 = %li",str2.retainCount); //retainCount -1 8          9 NSString *str3 = [[NSString alloc] initWithString:str2];  //retainCoutn -110 str3 release];

   NSString *str7 = [[NSString alloc] init];

    NSLog(@"str7 retainCount = %li",str7.retainCount);

    NSLog(@"str7 = %p",str7);   //列印地址,你會發現0x7fff75d4cd00  這是在棧區的  tm曾經都說對象不建立在棧記憶體區

   NSMutableString *mulStr1 = [[NSMutableString alloc] initWithString:str5];

    NSLog(@"mulStr1 retainCount = %li",mulStr1.retainCount);  //retainCount = 1

    NSLog(@"mulstr1 = %p",mulStr1);    

    NSMutableString *mulStr2 = [mulStr1 retain];

    NSLog(@"mulStr2 retainCount = %li",mulStr2.retainCount);  //retainCount = 2

    NSLog(@"mulstr2 = %p",mulStr2);

好吧:

先給出結論:

如果字串被建立在棧區和資料區段中,retainCount的值就是-1,而可變字串被建立在堆記憶體中的時候,其retainCount為1,並且可以retain方法,retainCount值增加一

雖然字串對象的引用計數不好把握,但是直接參考管理法則,就可以行之有效處理。

 

3.

objective-c記憶體管理模組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.