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