Con ARC, ya no puedo echar CGColorRef
a 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) op
convierte el operando al tipo de destinoT
. SiT
es un tipo de puntero de objeto retenible,op
debe tener un tipo de puntero no retenible. SiT
es 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) op
convierte 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) op
convierte 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_retained
o__bridge_transfer
fundido 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, CAGradientLayer
tiene una colors
propiedad que acepta una matriz de CGColorRef
s. Mi suposición es que debería usar __brige
aquí, pero no está claro exactamente por qué debería (o no debería).