我试图在iPhone SDK中了解内存管理的一个方面。
如果我跑了:
for (int x = 0; x < 10; x++) {
NSMutableArray *myArray = [[NSMutableArray alloc] init];
}
我在内存中创建了10个myArray对象,还是每个alloc都覆盖了之前的?如果是后者,我认为在循环之后我只需要一个[myArray release]来清理。如果是前者,我认为我需要在For循环中释放。
感谢。
答案 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个对象永远不会从内存中释放出来。 :)
答案 4 :(得分:0)
for (int x = 0; x < 10; x++) {
NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease
....
}
这会创建10个不同的NSMutableArray
个对象。实际上你不需要明确释放它们。myArray
在运行循环结束时自动释放。
如果使用名称以“alloc”或“new”开头或包含“copy”的方法创建对象,则获得对象的所有权(例如,alloc
,newObject
或{ {1}}),或者如果您发送保留消息。您有责任使用mutableCopy
或release
放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。
在autorelease
中,您不接受数组的所有权,并且会自动发布给您。
您可以详细了解内存管理here。
答案 5 :(得分:0)
除了每个人(正确地)所说的,Cocoa还支持自动释放的对象。如果你改写你的代码片段:
for (int x = 0; x < 10; x++)
{
NSMutableArray *myArray = [NSMutableArray arrayWithObjects: ...];
//....
}
您仍然会分配10个不同的阵列,但 none 会泄露。它们最终是自动释放的。