黑马程序员-iOS基础-Objective-C基础(七)

来源:互联网 发布:一维数组与指针 编辑:程序博客网 时间:2024/06/08 14:49

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

更多关于内存管理

Objective-C的内存管理系统基于引用记数。所有我们需要关心的就是跟踪我们引用,以及在运行期内是否真的释放了内存。

用最简单的术语来解释,当我们alloc一个对象的时候,应该在某个时候retain了它。每次我们调用了alloc或者retain之后,我们都必须要调用release。

这就是引用记数理论。但是在实践的时候,只有两种情况我们需要创建一个对象:

1. 成为一个类的成员变量

2. 只临时的在一个函数里面被使用

在更多的时候,一个成员变量的setter应该仅仅autorelease旧的对象,然后retain新的对象。我们只需要在dealloc的时候调用release就可以了。

所以真正需要做的就是管理函数内部的local的引用。唯一的原则就是:假如我们alloc或者copy了一个对象,那么我们在函数结束的时候需要release或者autorelease它。假如我们是通过别的方式创建的,就不管。

这里是管理成员对象的例子:

  1. - (void) setTotalAmount: (NSNumber*)input  
  2.  
  3. {  
  4.  
  5. [totalAmount autorelease];  
  6.  
  7. totalAmount = [input retain];  
  8.  
  9. }  
  10.  
  11. - (void) dealloc  
  12.  
  13. {  
  14.  
  15. [totalAmount release];  
  16.  
  17. [super dealloc];  
  18.  
  19. }  
  20.  

这里是本地引用的例子。我们只需要release我们用alloc创建的对象:

  1. NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.  
  3. NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  4.  
  5. // only release value1, not value2  
  6.  
  7. [value1 release];  
  8.  

这里是用本地引用对象去设一个成员变量的例子:

  1. NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.  
  3. [self setTotal:value1];  
  4.  
  5. NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  6.  
  7. [self setTotal:value2];  
  8.  
  9. [value1 release];  
  10.  

注意到如何管理本地引用其实都是一样的。不管你是否把它设给了一个成员变量。我们无须考虑setters的内部实现。

如果我们很好的理解了这些的话,我们基本上理解了80%的Objective-C内存管理方面的内容了。

 

0 0