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