Con ARC, non riesco più a lanciare CGColorRef
a 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) op
lancia l'operando sul tipo di destinazioneT
. SeT
è un tipo di puntatore oggetto conservabile,op
deve 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) op
lancia 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) op
lancia 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_retained
o__bridge_transfer
cast 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, CAGradientLayer
ha una colors
proprietà che accetta una matrice di CGColorRef
s. La mia ipotesi è che dovrei usare __brige
qui, ma esattamente perché dovrei (o non dovrei) non è chiaro.