标签:
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 = 1 Dog *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 -1 10 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.
标签:
原文地址:http://www.cnblogs.com/BeyondAverage0908/p/4587005.html