Освобождение объектов в блоках Objective-C - PullRequest
3 голосов
/ 13 сентября 2010

При использовании объекта 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];
    }];

Инструменты сообщают об экспорте сессии как утечка. У меня также есть несколько собственных классов, которые используют ту же методологию, и о них также сообщают как о утечках.

Из всего, что я прочитал, кажется, что код должен следовать правильным правилам управления памятью, но что-то должно быть в порядке. Я нашел ссылку на эту статью , но я не думаю, что я вызываю циклическое удержание.

1 Ответ

6 голосов
/ 13 сентября 2010

Блоки в 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 будет поддерживаться живым блоком, а сам блок будет поддерживаться живым объектом.

Когда вы имеете дело с блоками, я предлагаю вам использовать среду для сбора мусора.

...