iPhone内存管理,一个新手问题

时间:2010-04-26 13:37:43

标签: iphone memory-management

我在(Apple)示例代码中看到了两种分配内存的方式,并且我不确定我是否理解了差异和产生的行为。

// FAILS
NSMutableArray *anArray = [NSMutableArray array];
[anArray release];

// WORKS
NSMutableArray *anArray1 = [[NSMutableArray alloc] init];
[anArray release];

通过“FAILS”我的意思是我遇到了崩溃/运行时警告等,并且并不总是在我发布后立即发布......

任何解释都表示赞赏。

由于

3 个答案:

答案 0 :(得分:6)

请记住

NSMutableArray *anArray = [NSMutableArray array];

表现得像:

NSMutableArray *anArray1 = [[[NSMutableArray alloc] init] autorelease];

因此,当您尝试释放自动释放的对象时,再次执行发布会导致崩溃。

希望这会对你有所帮助。

谢谢,

Madhup

答案 1 :(得分:2)

在第一个实例中,您将获得一个autoreleased对象,您无需发布

第二个实例是您自己手动分配内存的位置,因此您负责释放内存。

请阅读本文档以获取帮助: -

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

答案 2 :(得分:1)

澄清djhworlds的回应:

alloccopymutableCopynew使您成为新对象的所有者,retain使您成为现有对象的所有者,并且你负责-[(auto)release]它。其他方法返回一个-[autoreleased]的对象,因此你对它没有任何责任,但要注意:它会在运行循环的下一次迭代中消失(通常),因为它是通常当自动释放池耗尽时。

这方面的实际结果是// FAILS版本在特定代码段的上下文中完美运行,但是一旦运行循环滚动并且池被耗尽,您的对象已经被释放并且已经消失,导致事情要发展。