Con ARC, non riesco più a lanciare CGColorRefa id. Ho imparato che devo fare un cast col ponte. Secondo clang docs :
Un cast con bridge è un cast in stile C annotato con una delle tre parole chiave:
(__bridge T) oplancia l'operando sul tipo di destinazioneT. SeTè un tipo di puntatore oggetto conservabile,opdeve avere un tipo di puntatore non conservabile. SeTè un tipo di puntatore non conservabile, op deve avere un tipo di puntatore oggetto conservabile. Altrimenti il cast è mal formato. Non vi è alcun trasferimento di proprietà e ARC non inserisce operazioni di conservazione.
(__bridge_retained T) oplancia l'operando, che deve avere un tipo di puntatore oggetto conservabile, sul tipo di destinazione, che deve essere un tipo di puntatore non conservabile. ARC mantiene il valore, fatte salve le consuete ottimizzazioni sui valori locali, e il destinatario è responsabile del bilanciamento di +1.
(__bridge_transfer T) oplancia l'operando, che deve avere un tipo di puntatore non conservabile, sul tipo di destinazione, che deve essere un tipo di puntatore oggetto conservabile. ARC rilascerà il valore alla fine dell'espressione completa inclusa, fatte salve le consuete ottimizzazioni sui valori locali.Questi cast sono necessari per trasferire oggetti dentro e fuori il controllo ARC; vedere la logica nella sezione sulla conversione dei puntatori di oggetti conservabili.
L'uso di a
__bridge_retainedo__bridge_transfercast esclusivamente per convincere ARC a emettere un mantenimento o un rilascio sbilanciato, rispettivamente, è una forma scadente.
In che tipo di situazioni dovrei usare ciascuna?
Ad esempio, CAGradientLayerha una colorsproprietà che accetta una matrice di CGColorRefs. La mia ipotesi è che dovrei usare __brigequi, ma esattamente perché dovrei (o non dovrei) non è chiaro.