【问题标题】:How many objects are created if alloc'ed in a loop如果在循环中分配,会创建多少个对象
【发布时间】:2011-08-04 19:28:15
【问题描述】:

我正在努力思考 iPhone SDK 中内存管理的一个方面。

如果我跑了:

for (int x = 0; x < 10; x++)  {
    NSMutableArray *myArray = [[NSMutableArray alloc] init];
}

我是在内存中创建 10 个 myArray 对象,还是每个 alloc 都会覆盖前一个?如果是后者,我想在循环之后我只需要一个 [myArray release] 来清理。如果是前者,我想我需要在 For 循环中释放。

谢谢。

【问题讨论】:

  • 10 个对象有 9 个泄漏。
  • 感谢所有回答的人。我有我的怀疑,但这有助于消除混乱。

标签: ios memory-management alloc


【解决方案1】:

你得到十个不同的分配,如果你不想内存泄漏,你需要释放它们。

 for (int x = 0; x < 10; x++)  {

    NSMutableArray *myArray = [[NSMutableArray alloc] init];
    ....
    [myArray release];
 }

如果您不释放,泄漏的对象实际上是 10,而不是评论中的 9,因为在循环之外您无权访问循环局部变量,并且最后分配的对象也将无法访问。

【讨论】:

    【解决方案2】:

    实际上,您有 10 个对象,其中有 10 个泄漏。一旦离开循环,myArray 就不再在范围内(因此无法访问),因此也无法释放第 10 次分配。

    【讨论】:

      【解决方案3】:

      您正在创建 10 个对象,其中 9 个已泄露。 您应该在循环结束时使用它们后释放。

      这也不仅仅与 iPhone SDK 有关。这是基本的 Cocoa 内存管理。也适用于 Mac。

      【讨论】:

      • 最后是的,是 10,但我想表明最后一个实例化覆盖了前一个 9(它们泄漏)并且在最后一次分配之后只有第 10 个仍然存在。
      • 如果我自动释放,即作为循环但调用 NSMutableArray *myArray = [[[NSMutableArray alloc] init]autorelease],事情会如何改变?我从来不明白 iOS 什么时候知道(自动)释放一个对象。
      • 那么所有 10 个将在运行循环结束时被释放。该框架在运行循环的每次运行周围都有一个 AutoRelease 池。因此,在一个运行循环的所有代码结束时,所有自动释放的对象都将被释放。话虽如此,如果您希望您的代码自动释放大量对象,则可以创建自己的自动释放池。特别是在这种情况下,当您在循环中自动释放时。如果循环中不是 10 个而是 1,000,000 个对象,最好在循环中放置一个自动释放池以防止内存增长。
      【解决方案4】:

      在这种情况下,您将创建 10 个不同的 Array 对象,每个对象的保留计数为 1,并且没有任何引用。这将是一个“内存泄漏工厂”,其中 10 个对象永远不会从内存中释放。 :)

      oooops...没有看到发布...9 个泄露的数组。

      【讨论】:

      • 我猜你看到的版本在我的回答中...... :-) 所以泄漏是 10,你是对的......
      【解决方案5】:

      除了大家(正确地)说的,Cocoa 还支持自动释放对象。如果你这样改写你的 sn-p:

      for (int x = 0; x < 10; x++)
      {      
          NSMutableArray *myArray = [NSMutableArray arrayWithObjects: ...];     
          //....     
      } 
      

      你仍然分配了 10 个不同的数组,但是 none 被泄露了。它们最终会自动释放。

      【讨论】:

        【解决方案6】:
        for (int x = 0; x < 10; x++)  {
        
            NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease
            ....
        }
        

        这会创建 10 个不同的 NSMutableArray 对象。您实际上不需要显式释放它们。myArray 在运行循环结束时自动释放。

        如果您使用名称以“alloc”或“new”开头或包含“copy”的方法(例如,allocnewObjectmutableCopy)创建对象,则您将拥有该对象的所有权,或者,如果您向其发送保留消息。您有责任放弃使用releaseautorelease 拥有的对象的所有权。其他任何时候您收到物品时,都不得释放它。

        NSMutableArray *myArray = [NSMutableArray array]; 中,您不拥有该数组的所有权,它会自动释放传递给您。

        您可以了解更多关于内存管理的信息here

        【讨论】:

          猜你喜欢
          • 2021-06-14
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          • 1970-01-01
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多