Com o ARC, não posso mais transmitir CGColorRefpara 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) oplança o operando no tipo de destinoT. SeTé um tipo de ponteiro de objeto retido,opdeve ter um tipo de ponteiro não retido. SeTfor 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) opconverte 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) opconverte 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_retainedou__bridge_transferelenco 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, CAGradientLayerpossui uma colorspropriedade que aceita uma matriz de CGColorRefs. Meu palpite é que eu deveria usar __brigeaqui, mas exatamente por que eu deveria (ou não) não é claro.