/ / Uvoľňovanie objektov v objektoch Objective-C - iphone, object-c-blocks

Oslobodenie objektov v objektívnych blokoch - iphone, objektív-c-bloky

Ak používate objekt Objective-C, ktorý sa vracia asynchrónne s obslužným programom dokončenia, ako je napríklad AVAssetExportSession, existuje niečo podobné s týmto kódom:

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

Nástroje vykazujú export ako reláciu. Mám tiež niekoľko mojich tried, ktoré používajú rovnakú metodiku a tiež dostávajú hlásené ako úniky.

Zo všetkého, čo som čítal, sa zdá, že kód by mal nasledovať správne pravidlá správy pamäte, ale niečo musí byť hore tento článok, ale nemyslím si, že by som spôsobil cyklické zadržanie.

odpovede:

6 pre odpoveď č. 1

Bloky v Objective-C automaticky prevezme vlastníctvo predmetov v ich rozsahu a spôsobíte cyklický odkaz. Váš blok si zachováva exportSession implicitne a exportSession váš blok si pravdepodobne ponechá.

Pravidlá správy pamäte hovoria, že by ste sa mali čo najskôr vzdať vlastníctva objektov. Správne miesto na to, aby ste to urobili, je vo vašom prípade po výzve exportAsynchronouslyWithCompletionHandler:.

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

Cyklický odkaz by mal byť zrejmý takto: exportSession blok bude udržovaný nažive a samotný blok bude objekt udržovaný nažive.

Keď sa zaoberáte blokmi, odporúčam vám použiť prostredie určené na odvoz odpadu.