Avec ARC, je ne peux plus lancer CGColorRef
de casting id
. J'ai appris que je devais faire un casting ponté. Selon les documents de Clang :
Une distribution pontée est une distribution de style C annotée avec l'un des trois mots clés suivants:
(__bridge T) op
convertit l'opérande en type de destinationT
. SiT
est un type de pointeur d'objet pouvant être conservé, alorsop
doit avoir un type de pointeur non conservable. SiT
est un type pointeur non conservable, alors op doit avoir un type pointeur objet conservable. Sinon, le plâtre est mal formé. Il n'y a pas de transfert de propriété et ARC n'insère aucune opération de conservation.
(__bridge_retained T) op
convertit l'opérande, qui doit avoir un type de pointeur d'objet conservable, en type de destination, qui doit être un type de pointeur non conservable. ARC conserve la valeur, sous réserve des optimisations habituelles sur les valeurs locales, et le destinataire est responsable de l'équilibrage de ce +1.
(__bridge_transfer T) op
convertit l'opérande, qui doit avoir un type de pointeur non conservable, en type de destination, qui doit être un type de pointeur d'objet conservable. ARC publiera la valeur à la fin de l'expression complète englobante, sous réserve des optimisations habituelles sur les valeurs locales.Ces moulages sont nécessaires pour transférer des objets dans et hors du contrôle ARC; voir la justification dans la section sur la conversion des pointeurs d'objets conservables.
Utiliser un
__bridge_retained
ou un__bridge_transfer
moulage uniquement pour convaincre l'ARC d'émettre une retenue ou une libération déséquilibrée, respectivement, est une mauvaise forme.
Dans quel genre de situations utiliserais-je chacun?
Par exemple, CAGradientLayer
a une colors
propriété qui accepte un tableau de CGColorRef
s. Je suppose que je devrais utiliser __brige
ici, mais exactement pourquoi je devrais (ou ne devrais pas) n'est pas clair.