Sobes.tech
Junior — Middle

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 Foundation objektus, kurie tiesiogiai nepalaiko ARC. Tokiu atveju reikia rankiniu būdu valdyti atmintį naudojant CFBridgingRetain ir CFBridgingRelease.

  • Rašant Objective-C kodą naudojant __bridge_retained ir __bridge_transfer konvertuojant 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 weak ir unowned.

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);