2014-09-24 6 views
8

Quando penso a ARC non c'è un sovraccarico di rilascio. Ma una volta individuate le variabili Core Foundation, devono essere rilasciate anche in ARC.Objective-c: Perché le variabili della Core Foundation necessitano di rilascio esplicito in ARC?

Sebbene le regole ARC siano diverse per NS.. e CF.., c'è qualche motivo specifico per non supportare CF.. in ARC?

+2

So perché ma non ** PERCHÉ ** se questo ha un senso. CF è un framework C reso disponibile per iOS e OS X e il compilatore ARC non può tracciare allocazioni di memoria in esso. Questo è il motivo per cui è necessario rilasciare manualmente le cose. Ma non lo so ** PERCHÉ ** ARC non è in grado di monitorare. Detto questo, questo è parte del motivo per cui Swift è arrivato. Rimuove del tutto la necessità del materiale C. :) – Fogmeister

+0

@Fogmeister: Accetto, ma CF non viene importata come da C? se no, perché non viene modificato per soddisfare il requisito? – preetam

risposta

12

Quando penso a ARC non c'è un sovraccarico di rilascio.

Immagino tu voglia dire "Non devo preoccuparmi di rilascio". C'è spesso un sovraccarico di prestazioni, anche se il compilatore può talvolta ottimizzarlo.

Sebbene le regole ARC siano diverse per NS .. e CF .., c'è qualche motivo specifico per non supportare CF .. in ARC? Oggetti

Molti Fondazione Nucleo sono gestito da ARC, e il numero di essi continua ad aumentare. Puoi sapere se una particolare funzione supporta ARC guardando nell'intestazione per CF_IMPLICIT_BRIDGING_ENABLED. Se lo vedi, le funzioni restituiscono oggetti CF compatibili con ARC. Ad esempio, in iOS 8 sono state aggiunte all'elenco molte funzioni di grafica principale. (Non voglio esagerare, non sto dicendo che oggi non lo fai oggi su questo CFRelease. Sto dicendo che sono impostati per essere gestiti da ARC, sono gestiti da ARC in Swift, e essi possono fine essere trattati direttamente nel objC senza bisogno CFRelease.)

il motivo oggetti CF non sono di default gestiti è che qualcuno ha dovuto passare attraverso e verificare (audit) che ogni funzione è conforme alla Creazione Convenzioni di denominazione delle regole o che siano correttamente annotate per le loro eccezioni. È un lavoro abbastanza noioso, e Apple lo ha diffuso in diverse versioni. Ma dovresti vederlo migliorare nel tempo.

Kazuki è corretto che non è possibile inserire oggetti gestiti da ARC in una struttura o unione, ma questo di solito non influisce su Core Foundation.

BTW, CF_IMPLICIT_BRIDGING_ENABLED è solo un involucro intorno al pragma clang arc_cf_code_audited clang. Questo è spiegato nei documenti ARC, 7.8.1 Auditing of C retainable pointer interfaces.

7

Core Foundation è a pure C library. Quindi, almeno, c'è un motivo per cui ARC non può supportare direttamente l'oggetto Core Foundation.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership-qualified-fields-of-structs-and-unions

4.3.5 campi di proprietà qualificata di strutture e unioni

un programma è mal formato se si dichiara un membro di una struct C o unione di avere un non banali, di proprietà qualificato genere.

Razionale

Il tipo risultante sarebbe non-POD nel senso C++, ma C non dare noi molto buoni strumenti linguistici per la gestione del ciclo di vita degli aggregati, in modo da è più conveniente per semplicemente non voglia . È ancora possibile per gestire questo con un * vuoto o un oggetto __unsafe_unretained.

Quindi LLVM compilatore non in grado di gestire il ciclo di vita degli oggetti core della Fondazione in strutture e le organizzazioni sindacali così come questa spiegazione, a causa di C does not give us very good language tools for managing the lifetime of aggregates.