С ARC я больше не могу отбрасывать CGColorRef
до id
. Я узнал, что мне нужно сделать мостовой бросок. Согласно clang docs:
A bridged cast - это стиль C-стиля, аннотированный одним из трех ключевых слов:
(__bridge T) op
переводит операнд в тип назначенияT
. ЕслиT
является сохраняемым типом указателя объекта, тогдаop
должен иметь не сохраняемый тип указателя. ЕслиT
- не сохраняемый тип указателя, то op должен иметь тип сохраняемого типа объекта. В противном случае бросок плохо сформирован. Передача права собственности отсутствует, и ARC не вставляет сохранить операции.
(__bridge_retained T) op
выдает операнд, который должен иметь тип сохраняемого типа объекта, к типу назначения, который должен быть не сохраняемый тип указателя. ARC сохраняет значение, при условии, что обычная оптимизация по локальным значениям, а получатель отвечает для балансировки, что +1.
(__bridge_transfer T) op
выдает операнд, который должен иметь не сохраняемый тип указателя, к типу назначения, который должен быть сохраняемый тип указателя объекта. ARC выпустит значение в конце включения полного выражения, при условии обычной оптимизации по локальным значениям.Эти отбрасывания необходимы для переноса объектов в и из Контроль ARC; см. обоснование в разделе о конверсии сохраняемые указатели объектов.
Использование a
__bridge_retained
или__bridge_transfer
для чистоты, чтобы убедить ARC для испускания неуравновешенного удержания или освобождения, соответственно, является плохим форма.
В каких ситуациях я бы использовал каждый?
Например, CAGradientLayer
имеет свойство colors
, которое принимает массив CGColorRef
s. Я предполагаю, что я должен использовать __brige
здесь, но именно поэтому я должен (или не должен) неясно.