標籤:
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記憶體管理模組