【问题标题】:Clarification on IPhone Memory management(autorelease)关于 iPhone 内存管理的说明(自动释放)
【发布时间】:2011-05-14 16:25:11
【问题描述】:

我知道在here 之前已经回答了一个类似的问题,但我只是想确保我能更好地理解它。这是我的场景...

我有一个帮助类方法返回分配的 UIImageView,如下所示。

+(UIImageView *)tableCellButton{
 return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease];

}

然后,在我的 UIViewController 方法之一中,我正在使用它..

UIImageView *imageView = [Helper tableCellButton];
imageView.frame = cell.backgroundView.bounds;
imageView.tag = 250;
[cell.backgroundView addSubview:imageView];

我的问题是关于如何释放这些内存。我没有使用自动释放池(除了创建的应用程序),并且该变量不是 iVar/Property(因此在调用 dealloc 时它不会被释放)。在这种情况下,我是否负责在调用后释放内存?自动释放何时发挥作用?感谢您的帮助!

【问题讨论】:

  • 在此处查看此问题,了解何时使用AutoreleasePool Releases。希望这会给你一些见解。您永远不必 release 和对象 auto-released. 如果它是在按钮按下期间创建的,或者只要 cell.backgroundView 持续存在(addSubview 保留),它可能只会持续存在于“事件”中。 /跨度>
  • 就发布了...所以,我的应用程序中唯一的自动释放池是位于 main.js 中的那个。既然是这种情况,这会导致泄漏,还是会在 ViewController 清理表格和单元格时向该对象发送释放?
  • 感谢您的回复!我还找到了 iOS 的内存管理文档(不知道我之前是怎么错过的)。 developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…

标签: iphone memory-management autorelease


【解决方案1】:

autorelease 的调用将导致release 在下一次通过事件循环时被发送到对象。这将解释您在tableCellButton 中拨打的alloc 电话。唯一一次保留对象是在addSubview 内部,它也将处理它自己的同一对象的release。那么根据上面的代码,你就可以签出这个对象的内存管理了。

【讨论】:

    【解决方案2】:

    runloop 的每次迭代都有自己的自动释放池。

    基本上,这样想:

    while(1)
    {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        [someObject doSomething];
        [pool drain];
    }
    

    【讨论】:

    • 当应用程序运行时,是否为每个事件创建了一个自动释放池,还是只有一个全局的?
    • 每个事件。这意味着,当事件完成时,自动释放池被耗尽,并创建一个新池。 main 中有一个自动释放池,但这基本上是程序结束前的最后一个集合。
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多