Kokiose situacijose būtina aiškiai naudoti retain ir release automatinės atminties valdyme (ARC) iOS platformoje?
sobes.tech AI
Atsakymas iš AI
iOS aplinkoje su ARC (Automatinis nuorodų skaičiavimas), kūrėjas paprastai nevaldo rankiniu būdu retain ir release — tai daro kompiliatorius. Tačiau yra retų situacijų, kai gali būti reikalingas šių metodų aiškus naudojimas:
-
Sąveika su žemo lygio API Objective-C, kur ARC negali tiksliai nustatyti objekto gyvavimo laiko, pavyzdžiui, naudojant
Core Foundationobjektus, kurie tiesiogiai nepalaiko ARC. Tokiu atveju reikia rankiniu būdu valdyti atmintį naudojantCFBridgingRetainirCFBridgingRelease. -
Rašant Objective-C kodą naudojant
__bridge_retainedir__bridge_transferkonvertuojant tarp ARC tipų ir Core Foundation. -
Retais atvejais, įgyvendinant savo klases su nestandartiniu atminties valdymu arba siekiant išvengti stiprių nuorodų ciklų (retain cycles), nors paprastai naudojami
weakirunowned.
Apskritai, šiuolaikiniuose ARC taikomuose projektuose rankinis retain ir release naudojimas beveik nereikalingas ir net draudžiamas kompiliatoriaus. Jei tai būtina, geriau peržiūrėti architektūrą arba naudoti specialius tiltus Core Foundation.
Pavyzdys su Core Foundation:
CFStringRef cfStr = CFStringCreateWithCString(NULL, "Hello", kCFStringEncodingUTF8);
NSString *nsStr = (__bridge_transfer NSString *)cfStr; // ARC perims valdymą
// Be __bridge_transfer reikėtų rankiniu būdu iškviesti CFRelease(cfStr);