Sobes.tech
Junior — Middle

V ktorých situáciách je potrebné explicitne používať retain a release v automatickom správe pamäte (ARC) na platforme iOS?

sobes.tech AI

Odpoveď od AI

V prostredí iOS s ARC (Automatické počítanie referencií) vývojár zvyčajne ručne ne riadi retain a release — to robí prekladač. Existujú však zriedkavé situácie, kedy môže byť potrebné explicitne použiť tieto metódy:

  • Interakcia s nízkoúrovňovým API v Objective-C, kde ARC nemôže správne určiť životnosť objektu, napríklad pri použití objektov Core Foundation, ktoré priamo ARC nepodporujú. V takých prípadoch je potrebné spravovať pamäť manuálne pomocou CFBridgingRetain a CFBridgingRelease.

  • Pri písaní kódu v Objective-C s použitím __bridge_retained a __bridge_transfer na konverziu medzi typmi ARC a Core Foundation.

  • V zriedkavých prípadoch, pri implementácii vlastných tried s nestandardným riadením pamäti alebo pri vyhýbaní sa silným cyklom odkazov (retain cycles), hoci na to sa zvyčajne používajú weak a unowned.

Vo všeobecnosti, v moderných aplikáciách s ARC je manuálne používanie retain a release takmer zbytočné a dokonca zakázané kompilátorom. Ak je to potrebné, je lepšie prehodnotiť architektúru alebo použiť špeciálne mosty pre Core Foundation.

Príklad použitia s Core Foundation:

CFStringRef cfStr = CFStringCreateWithCString(NULL, "Hello", kCFStringEncodingUTF8);
NSString *nsStr = (__bridge_transfer NSString *)cfStr; // ARC prevezme správu
// Bez __bridge_transfer by ste museli manuálne zavolať CFRelease(cfStr);