如果在循环中分配,将创建多少个对象

时间:2011-08-04 19:28:15

标签: ios memory-management alloc

我试图在iPhone SDK中了解内存管理的一个方面。

如果我跑了:

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

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

感谢。

6 个答案:

答案 0 :(得分:2)

您可以获得十种不同的分配,如果您不希望内存泄漏,则需要释放它们。

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

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

如果你没有发布,泄漏的对象实际上是10,而不是每个注释9,因为在循环外你不能访问循环局部变量,最后分配的对象也将无法访问。 / p>

答案 1 :(得分:2)

实际上,你有10个对象有10个泄漏。离开循环后,myArray不再在范围内(因此无法访问),因此无法释放第10个分配。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

oooops ...没有看到发布...... 9个泄漏的阵列。

答案 4 :(得分:0)

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

    NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease
    ....
}

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

如果使用名称以“alloc”或“new”开头或包含“copy”的方法创建对象,则获得对象的所有权(例如,allocnewObject或{ {1}}),或者如果您发送保留消息。您有责任使用mutableCopyrelease放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。

autorelease中,您不接受数组的所有权,并且会自动发布给您。

您可以详细了解内存管理here

答案 5 :(得分:0)

除了每个人(正确地)所说的,Cocoa还支持自动释放的对象。如果你改写你的代码片段:

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

您仍然会分配10个不同的阵列,但 none 会泄露。它们最终是自动释放的。