Beyond平君

导航

Objective-c内存管理模块

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,而可变字符串被创建在堆内存中的时候,其retainCount1,并且可以retain方法,retainCount值增加一

虽然字符串对象的引用计数不好把握,但是直接参考管理法则,就可以行之有效的处理。

 

3.

posted on 2015-06-18 20:57  Beyond平君  阅读(198)  评论(0编辑  收藏  举报