Boo*_*oon 3 objective-c autorelease grand-central-dispatch
我正在使用dispatch_async,它反过来调用其他使用dispatch_async的代码,它使用for循环来分配至少50-100个对象.我怎么知道何时应该使用@autoreleasepool?我是否可以在分配超过10个对象的任何dispatch_async中使用@autoreleasepool,或者是否存在使用过多autoreleasepool的风险?
由于" 高级内存管理编程指南 "的" 使用自动释放池"部分建议使用"自动释放池","您必须或者这样做是有益的".我通常不会建议只是无缘无故地投入自动释放池,尽管你经常可以毫无意外地这样做.
在@autoreleasepool不需要,除非你正在处理你自己的NSThread情况下(这你是不是在这里做什么),或者如果你想明确地减少因使用许多自动释放对象的高水位.
在确定何时需要自动释放池以降低峰值内存利用率方面,它并不像"我有十个对象"那么简单.这是一个关于物体大小的问题,现在你有很多.如果处理大图像(例如20000 x 20000像素),则多个图像可能太多.如果处理小对象(字符串,数字等),那么您可以拥有数千个对象而不会导致问题.它仅适用于使用自动释放对象的地方.
所以,我建议采用一种经验方法,你可以考虑(a)常规使用的最大记忆量; (b)您正在使用多少个自动释放对象,并从那里做出决定.
但值得注意的是,在某些孤立的情况下,必须小心添加自动释放池.典型的示例是,NSError **如果存在某些错误,您将为其传回一个对象的方法具有参数.例如,此代码存在问题:
/** Some method that will optionally return error object.
*
* @param error The error object being returned
*
* @return This returns an NSData if successful, and `nil` upon error.
* See NSError object to determine why it failed.
*/
- (NSData *)someMethod:(NSError * __autoreleasing *)error
{
@autoreleasepool {
// do some stuff
// following line is wrong as the error will be released when pool is drained
if (failure)
*error = [NSError errorWithDomain:kMyAppDomain code:code userInfo:nil];
// etc
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以像这样重构它:
- (NSData *)someMethod:(NSError * __autoreleasing *)error
{
NSError *localError;
@autoreleasepool {
// do some stuff
// save it in some local variable outside of the scope of this block
if (failure) {
localError = [NSError errorWithDomain:kMyAppDomain code:code userInfo:nil];
}
}
// now you can return it safely
*error = localError;
// etc
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |