Object-C内存管理

时间:2022-04-19 22:06:59

  Object-C的内存管理是基于引用计数的。你要做的事情只是关注你的引用,而释放内存的工作实际上由运行环境完成。

  在最简单的情形中,你分配(alloc)的对象,或只是保留(retain)在一些地方的对象,都需要给他们发送一个release消息。这也意味着,如果你使用了一次alloc,然后又retain了一次,那么你需要release两次才能释放该对象的内存。

  这就是引用计数的理论。在实际应用中,通常只有两个原因我们才会创建一个对象:

  1.作为一个实例变量保留。

  2,在函数内部作为临时变量使用。

  大多数情况下,一个实例变量的setter会自动释放(autorelease)原来引用的对象,同时保留(retain)新的。你只需要保证在dealloc函数中释放(release)了它就行了。

  那么,我们实际要做的工作就只有管理函数内部的本地引用了。在这里只有一条规则:如果你通过alloc或者copy创建了一个对象,在函数结尾的地方给它发送一个release或者autorelease消息就行了。如果你是通过其他方式创建的对象,就什么也别做。

  下面是第一个例子,管理实例变量:

  - (void) setTotalAmount:(NSNumber *)input

  {
    [totalAmount autorelease];

    totalAmount = [input retain];

  }

  - (void)dealloc

  {

    [totalAmount release];

    [super dealloc];

  }

  下面是另外一个例子,关于本地引用。我们只需要释放通过alloc创建的对象就行了:

  NSNumber *value1 = [[NSNumber alloc] initWithFloat:8.75];

  NSNmuber *value2 = [NSNumber numberWithFloat:14.78];

  [value1 release];//这里只需要release value1就行

  下面是一个组合例子,将一个本地引用设置给实例变量:

  NSNumber *value1 = [[NSNumber alloc] initWithFloat:8.75];

  [self setTotalAmount:value1];

  NSNumber *value2 = [NSNumber numberWithFloat:14.78];

  [self setTotalAmount:value2];

  [value1 release];

  注意,不论你是不是把本地引用当成实例变量一样赋值,管理它们都是完全相同的。你不必考虑setter是如何实现的。

  如果你理解了这些,你就理解了关于Object-C内存管理中90%你需要知道的内容。