什么时候我应该将我的代码包装到自动释放池中

ite*_*nyh 9 iphone memory-management objective-c autorelease

我是objective-c的新手,我知道基本的内存管理规则,比如何时retain release autorelease.但是我不知道什么时候应该将代码包装到自动释放池中?为什么?

And*_*sen 22

与其他性能优化一样,如果您注意到内存使用率很高,通常只应向代码中添加其他自动释放池,例如,使用Instruments会导致您将其他自动释放池作为解决方案.

也就是说,您可以在自动释放池中的紧密循环中包装创建大量临时对象的代码.默认自动释放池在运行循环周期结束时耗尽.因此,如果您在代码中的for循环的每次迭代中创建了大量临时对象,则默认自动释放池将在整个循环运行之后才会耗尽,这意味着您创建的所有临时对象都可以累加到高临时内存使用率(有时称为"高水位线").您可以将循环的每个迭代包装在一个中,@autoreleasepool以便在该循环迭代中创建的不需要的,自动释放的临时对象更快地释放.

  • Apple会在适当的情况下推荐它.请参阅此处的文档:https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html (2认同)

Mac*_*ade 12

扩展以前的答案:

自动释放池用于release自动向添加到其中的对象发送消息.

在iOS或Cocoa程序中,会在主线程上自动创建自动释放池,并在运行循环结束时将其耗尽.

也就是说,在另一个线程上使用自动释放的对象时,必须使用自动释放池.

因此,如果将线程分离到某个方法,则将线程代码包装在自动释放池中.否则,线程中创建的自动释放对象将泄漏.

自动释放池的另一个用途是优化将使用大量内存的代码部分,因此它们在运行循环结束之前被释放.

但它只涉及自动发布的对象.

例如:

- ( void )test
{
    NSMutableArray * a = [ [ NSMutableArray alloc ] init ];

    [ a release ];
}
Run Code Online (Sandbox Code Playgroud)

这里不需要自动释放池,因为您没有自动释放的对象.
a变量将被立即释放,因为它已被明确分配并释放.

现在这个:

- ( void )test
{
    NSMutableArray * a = [ NSMutableArray arrayWithCapacity ];
}
Run Code Online (Sandbox Code Playgroud)

在这里,您使用的是便利构造函数,这意味着您没有该对象的所有权.
它还意味着该对象已添加到当前自动释放池(如果有的话).

因此,当自动释放池耗尽时,它将被释放,因此可能需要一些周期......

如果您编写的代码部分使用大量内存,则可以使用另一个自动释放池,以便在方法返回时释放自动释放的对象:

- ( void )test
{
    @autoreleasepool
    {
        NSMutableArray * a = [ NSMutableArray arrayWithCapacity ];
    }
}
Run Code Online (Sandbox Code Playgroud)