ite*_*nyh 9 iphone memory-management objective-c autorelease
我是objective-c的新手,我知道基本的内存管理规则,比如何时retain release autorelease.但是我不知道什么时候应该将代码包装到自动释放池中?为什么?
And*_*sen 22
与其他性能优化一样,如果您注意到内存使用率很高,通常只应向代码中添加其他自动释放池,例如,使用Instruments会导致您将其他自动释放池作为解决方案.
也就是说,您可以在自动释放池中的紧密循环中包装创建大量临时对象的代码.默认自动释放池在运行循环周期结束时耗尽.因此,如果您在代码中的for循环的每次迭代中创建了大量临时对象,则默认自动释放池将在整个循环运行之后才会耗尽,这意味着您创建的所有临时对象都可以累加到高临时内存使用率(有时称为"高水位线").您可以将循环的每个迭代包装在一个中,@autoreleasepool以便在该循环迭代中创建的不需要的,自动释放的临时对象更快地释放.
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)
| 归档时间: |
|
| 查看次数: |
4770 次 |
| 最近记录: |