我仍然试图围绕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];
答案 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.