С 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 здесь, но именно поэтому я должен (или не должен) неясно.