iphone内存管理和数组

时间:2011-11-19 02:59:42

标签: iphone ios memory-management

我仍然试图围绕iphone内存管理。我已经检查了泄漏,但我想确定。这是免于泄漏吗?

NSMutableArray *array = [[NSMUtableArray alloc] init];
NSMutableString *str = [[NSMutableString alloc]];

[str appendstring:@"hi"];

[array addObject:str];

[str release]; //this is the bit I am most concerned about


...some processing of array occurs...

[array release];

3 个答案:

答案 0 :(得分:4)

假设你的第二行实际上就是这样:

NSMutableString *str = [[NSMutableString alloc] init];

然后是的,这是没有泄漏的。当您将字符串添加到数组时,该数组会对字符串中的所有者感兴趣,因此您release对其所有权的后续语句就可以了。它仍然按预期存在于数组中。

当您释放数组时,它将负责清理自己的引用,包括指向您放入其中的字符串的引用。

答案 1 :(得分:1)

你可以写一些粘贴的东西,然后把它贴在你的桌子上

如果您分配,新的,初始化或复制,而不是您所有者:)

你必须释放它!没有人会为你清理。

**示例:

NSString *releaseMeLaterPlease = [NSString initWithString....];

如果您创建任何其他方式,例如在示例中假设“bag”是某个数组,

NSString *dontReleaseMe = [bag objectAtIndex:0];

现在,dontReleaseMe不是由alloc,new,init或copy创建的,因此您不会释放它们。有人会这样做。


如果在alloc和init之后使用autorelease,操作系统将负责释放它。


最重要的是:现在开发人员不必担心这些东西! Hoooooray!从iOS5开启自动参考计数

然而,由于并非所有设备都具有iOS5,因此学习很好:)

祝你好运!

答案 2 :(得分:0)

quixoto回答了这个问题,但只是为了明确,这里是关于每行代码中内存管理的内容:

NSMutableArray *array = [[NSMUtableArray alloc] init];  //array retain count = 1
NSMutableString *str = [[NSMutableString alloc]]; //str retain count = 1

[str appendstring:@"hi"];

[array addObject:str];   //str retain count = 2

[str release]; //str retain count = 1

...some processing of array occurs...

[array release]; //array retain count = 0 & str retain count = 0 .. objects will be removed from memory.