Con ARC, ya no puedo echar CGColorRefa id. Aprendí que necesito hacer un reparto en puente. Según los documentos de clang :
Un reparto en puente es un reparto de estilo C anotado con una de tres palabras clave:
(__bridge T) opconvierte el operando al tipo de destinoT. SiTes un tipo de puntero de objeto retenible,opdebe tener un tipo de puntero no retenible. SiTes un tipo de puntero no retenible, op debe tener un tipo de puntero de objeto retenible. De lo contrario, el elenco está mal formado. No hay transferencia de propiedad y ARC no inserta operaciones de retención.
(__bridge_retained T) opconvierte el operando, que debe tener un tipo de puntero de objeto retenible, en el tipo de destino, que debe ser un tipo de puntero no retenible. ARC retiene el valor, sujeto a las optimizaciones habituales en valores locales, y el destinatario es responsable de equilibrar ese +1.
(__bridge_transfer T) opconvierte el operando, que debe tener un tipo de puntero no retenible, al tipo de destino, que debe ser un tipo de puntero de objeto retenible. ARC liberará el valor al final de la expresión completa adjunta, sujeto a las optimizaciones habituales en valores locales.Estos lanzamientos son necesarios para transferir objetos dentro y fuera del control ARC; vea la justificación en la sección sobre conversión de punteros de objetos retenibles.
Usando una
__bridge_retainedo__bridge_transferfundido puramente para convencer ARC para emitir retener o liberar una desequilibrada, respectivamente, es la falta de forma.
¿En qué tipo de situaciones usaría cada una?
Por ejemplo, CAGradientLayertiene una colorspropiedad que acepta una matriz de CGColorRefs. Mi suposición es que debería usar __brigeaquí, pero no está claro exactamente por qué debería (o no debería).