释放Objective-C块中的对象

时间:2010-09-13 04:40:12

标签: iphone objective-c-blocks

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

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

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

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

1 个答案:

答案 0 :(得分:6)

在其范围内的对象的Objective-C automatically take ownership中阻塞,并且确实会导致循环引用。您的区块会隐式保留exportSessionexportSession可能会保留您的区块。

内存管理规则说你应该尽快放弃对象的所有权。因此,在您的情况下,正确的地方是在调用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将由块保持活动,并且块本身将由对象保持活动。

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