Com o ARC, não posso mais transmitir CGColorRef
para id
. Eu aprendi que preciso fazer um elenco em ponte. De acordo com clang docs :
Um elenco em ponte é um elenco no estilo C anotado com uma das três palavras-chave:
(__bridge T) op
lança o operando no tipo de destinoT
. SeT
é um tipo de ponteiro de objeto retido,op
deve ter um tipo de ponteiro não retido. SeT
for um tipo de ponteiro não retido, op deve ter um tipo de ponteiro de objeto retido. Caso contrário, o elenco está mal formado. Não há transferência de propriedade e o ARC não insere operações de retenção.
(__bridge_retained T) op
converte o operando, que deve ter o tipo de ponteiro de objeto retido, no tipo de destino, que deve ser um tipo de ponteiro não retido. O ARC retém o valor, sujeito às otimizações usuais nos valores locais, e o destinatário é responsável por equilibrar esse +1.
(__bridge_transfer T) op
converte o operando, que deve ter um tipo de ponteiro não retido, no tipo de destino, que deve ser um tipo de ponteiro de objeto retido. O ARC liberará o valor no final da expressão completa anexa, sujeito às otimizações usuais nos valores locais.Esses lançamentos são necessários para transferir objetos para dentro e fora do controle do ARC; veja a justificativa na seção sobre conversão de ponteiros de objetos retidos.
O uso de um
__bridge_retained
ou__bridge_transfer
elenco puramente para convencer o ARC a emitir uma retenção ou liberação desequilibrada, respectivamente, é uma forma ruim.
Em que tipo de situações eu usaria cada uma?
Por exemplo, CAGradientLayer
possui uma colors
propriedade que aceita uma matriz de CGColorRef
s. Meu palpite é que eu deveria usar __brige
aqui, mas exatamente por que eu deveria (ou não) não é claro.