З АРК, я більше не можу кинути 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
властивість, яка приймає масив CGColorRef
s. Я здогадуюсь, що я повинен використовувати __brige
тут, але точно, чому я повинен (або не повинен), незрозуміло.