【问题标题】:iPhone memory management, a newbie questioniPhone内存管理,一个新手问题
【发布时间】:2011-02-12 10:03:27
【问题描述】:

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

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

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

“失败”是指我收到崩溃/运行时警告等,而且并非总是在我调用发布时立即...

任何解释表示赞赏。

谢谢

【问题讨论】:

标签: iphone memory-management


【解决方案1】:

请记住

NSMutableArray *anArray = [NSMutableArray array];

表现得像:

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

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

希望对你有所帮助。

谢谢,

马杜普

【讨论】:

    【解决方案2】:

    首先你得到一个autoreleased 对象,你不需要释放它

    第二个实例是您自己手动分配内存的地方,因此您有责任释放它。

    阅读此文档以获取帮助:-

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

    【讨论】:

    【解决方案3】:

    澄清 djhworlds 的回应:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多