【问题标题】:Objective C Array and Object ReleaseObjective C 数组和对象释放
【发布时间】:2011-01-26 22:50:09
【问题描述】:

我有一个关于何时释放 NSArray 的元素的新手问题。见以下伪代码:

NSMutalbeArray *2DArray = [[NSMutableArray alloc] initWithCapacity:10];
for (int i=0;i<10;i++) {
  NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5];
  for (int j=0;j<5;j++) {
    MyObject *obj = [[MyObject alloc] init];
    [array addObject:obj];
    [obj release];
  }

  [2DArray addObject:array];
  [array release];
}
// use 2DArray to do something

[2DArray release]

我的问题是,当我释放 2DArray 时,是否需要先显式释放它的每个元素(数组)?另外,在我释放“数组”对象之前,是否需要先释放它的每个元素(MyObject)?

我是 Objective C 的新手。请帮忙。谢谢。

【问题讨论】:

    标签: objective-c arrays memory-management


    【解决方案1】:

    不,您不需要告诉每个对象是released。当您向NSArray 发送release 方法时,它会首先自动向其中的每个项目发送release 方法。

    所以在你的情况下,你发送[2DArray release]。这会自动将[array release] 发送到每个其他数组,从而将[obj release] 发送到每个array 中的每个对象。

    【讨论】:

      【解决方案2】:

      您不需要释放保留的对象。 NSArray 在添加时保留它们,并在释放时释放它们。所以如果你分配,添加到数组,然后释放,数组中的对象将保留计数为1。一旦数组被释放,对象被释放,因此被释放。

      【讨论】:

        【解决方案3】:

        当一个对象被创建时,它的保留计数为 1。每当一个对象被添加到一个数组中时,它的保留计数就会增加(在本例中为 2)。添加到数组后,您的代码释放其对对象的持有,将其保留计数减少 1(在本例中为 1)。然后,当您释放数组时,它会在其中的所有内容上调用 release,将其保留计数减 1(在本例中为 0)。当保留计数达到 0 时,对象被释放。

        从内存管理的角度来看,您的代码看起来是正确的。

        【讨论】:

          猜你喜欢
          • 2010-12-22
          • 1970-01-01
          • 1970-01-01
          • 2012-08-27
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多