我在(Apple)示例代码中看到了两种分配内存的方式,并且我不确定我是否理解了差异和产生的行为。
// FAILS
NSMutableArray *anArray = [NSMutableArray array];
[anArray release];
// WORKS
NSMutableArray *anArray1 = [[NSMutableArray alloc] init];
[anArray release];
通过“FAILS”我的意思是我遇到了崩溃/运行时警告等,并且并不总是在我发布后立即发布......
任何解释都表示赞赏。
由于
答案 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的回应:
alloc
,copy
,mutableCopy
和new
使您成为新对象的所有者,retain
使您成为现有对象的所有者,并且你负责-[(auto)release]
它。其他方法返回一个-[autoreleased]
的对象,因此你对它没有任何责任,但要注意:它会在运行循环的下一次迭代中消失(通常),因为它是通常当自动释放池耗尽时。
这方面的实际结果是// FAILS版本在特定代码段的上下文中完美运行,但是一旦运行循环滚动并且池被耗尽,您的对象已经被释放并且已经消失,导致事情要发展。