2011-11-19 103 views
0

我仍然试图围绕iphone内存管理。我已经检查了这个漏洞,但我想确保。这是没有泄漏?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

可能没有泄漏,但它不”编译。 :) –

+1

缺少第2行的'init'?无论如何,似乎是无泄漏的。 – Ryan

+0

我的书中关于这个主题的章节可以免费在线获得:http://www.apeth.com/iOSBook/ch12.html#_memory_management(当然,所有这些都会被重写,以考虑到ARC) – matt

回答

4

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

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

然后是的,这是无泄漏。当你将字符串添加到数组中时,数组会获得字符串中的所有者权益,因此您对其拥有权的后续声明没有问题。它按预期仍然存在于数组中。

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

1

凭经验,你可能写这个ON便条贴在你的办公桌

如果页头,新,init或复制比你的老板:)

你必须发布它!没有人会为你清理。

**例:

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

如果创建任何其他方式如实例假设 “袋” 是一些阵列,

NSString *dontReleaseMe = [bag objectAtIndex:0]; 
现在

,dontReleaseMe不创建通过alloc,new,init或copy,所以你不会释放它们。有人会这样做。


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


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

不过这是好事,因为学习不是所有的设备已经iOS5的:)

祝你好运!

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.