З АРК, я більше не можу кинути CGColorRefв id. Я дізнався, що мені потрібно виконати мост. Згідно з документами clang :
Містки кидок є C-стиль литого анотований з одним з трьох ключових слів:
(__bridge T) opвідкидає операнда до типу призначенняT. ЯкщоTце тип вказівника з можливістю відновлення, то вінopповинен мати тип невідступного вказівника. ЯкщоTтип покажчика, який не можна отримати, то оп повинен мати тип вказівника, який можна отримати для об'єкта. Інакше акторський склад формується неправильно. Передача права власності не відбувається, і ARC не вставляє жодних операцій із збереженням.
(__bridge_retained T) opпередає операнду, який повинен мати тип вказівника, який можна отримати для об'єкта, до типу призначення, який повинен бути невідступним типом вказівника. ARC зберігає значення, за умови звичайних оптимізацій для місцевих значень, і одержувач несе відповідальність за балансування цього +1.
(__bridge_transfer T) opпередає операнду, який повинен мати недоступний тип вказівника, на тип призначення, який повинен бути типом вказівника, який можна отримати для об'єкта. ARC випустить значення в кінці додається повного виразу, за умови звичайних оптимізацій для локальних значень.Ці трансляції необхідні для передачі об'єктів в управління АРК та поза ним; див. обґрунтування в розділі про перетворення покажчиків об'єкта, що можна отримати.
Використовувати
__bridge_retainedабо__bridge_transferвводити суто, щоб переконати ARC випускати незбалансоване утримування або випуск відповідно, є поганою формою.
У яких ситуаціях я б використовував кожну?
Наприклад, CAGradientLayerмає colorsвластивість, яка приймає масив CGColorRefs. Я здогадуюсь, що я повинен використовувати __brigeтут, але точно, чому я повинен (або не повинен), незрозуміло.