繁体   English   中英

释放Objective-C块中的对象

[英]Freeing Objects in Objective-C Blocks

当使用与完成处理程序(如AVAssetExportSession)异步返回的Objective-C对象时,有任何代码如下所示:

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
    [exportSession release];
    }];

仪器将exportSession报告为泄漏。 我也有一些我自己的类使用相同的方法,他们也被报告为泄漏。

从我读过的所有内容看来,代码应该遵循适当的内存管理规则,但必须要有一些东西。 我找到了这篇文章的链接,但我认为我没有引起循环保留。

Objective-C中的块自动获取其作用域中对象的所有权 ,并且确实会导致循环引用。 您的块隐式保留exportSession ,并且exportSession可能会保留您的块。

内存管理规则说你应该尽快放弃对象的所有权。 因此,在你的情况下,正确的地方就是在调用exportAsynchronouslyWithCompletionHandler:

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
}];
[exportSession release];

循环引用应该是显而易见的: exportSession将由块保持活动,并且块本身将由对象保持活动状态。

当你处理块时,我建议你使用垃圾收集环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM