1

我试图让我的注意力集中在 iPhone SDK 中内存管理的一个方面。

如果我跑:

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

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

谢谢。

4

6 回答 6

2

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

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

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

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

于 2011-08-04T19:31:55.950 回答
2

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

于 2011-08-04T19:33:30.080 回答
1

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

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

于 2011-08-04T19:30:45.107 回答
1

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

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

于 2011-08-04T19:33:06.447 回答
0
for (int x = 0; x < 10; x++)  {

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

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

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

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

您可以在此处了解有关内存管理的更多信息。

于 2011-08-04T19:36:07.920 回答
0

除了大家(正确地)说的,Cocoa 还支持自动释放对象。如果您这样改写您的代码段:

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

您仍然分配了 10 个不同的数组,但没有一个被泄露。它们最终会自动发布。

于 2011-08-04T19:54:10.813 回答