ARC으로, 나는 더 이상 캐스팅 할 수 없습니다 CGColorRef
에 id
. 브리지 캐스트를해야한다는 것을 알게되었습니다. clang 문서 에 따르면 :
브리지 캐스트는 C 스타일 캐스트는 세 가지 키워드 중 하나의 주석을 붙일 수 :
(__bridge T) op
피연산자를 대상 유형으로 캐스팅합니다T
. 경우T
보존 가능한 개체 포인터 유형이 다음op
비 보존 가능한 포인터 타입이 있어야합니다. 경우T
비 보존 가능한 포인터 타입이며, 다음 작전은 보존 가능한 개체 포인터 유형이 있어야합니다. 그렇지 않으면 캐스트가 잘못 형성됩니다. 소유권 이전이 없으며 ARC는 보유 작업을 삽입하지 않습니다.
(__bridge_retained T) op
유지할 수있는 객체 포인터 유형을 가져야하는 피연산자를 대상 유형으로 캐스트 할 수없는 대상 유형으로 캐스트합니다. ARC는 로컬 값에 대한 일반적인 최적화에 따라 값을 유지하며 수신자는 +1의 균형을 맞 춥니 다.
(__bridge_transfer T) op
유지할 수없는 포인터 유형을 가져야하는 피연산자를 대상 유형으로 캐스트합니다.이 유형은 보유 가능한 객체 포인터 유형이어야합니다. ARC는 로컬 값에 대한 일반적인 최적화에 따라 둘러싸는 전체 표현이 끝나면 값을 해제합니다.이러한 캐스트는 ARC 제어 안팎으로 오브젝트를 전송하기 위해 필요합니다. 보유 가능한 객체 포인터의 변환에 대한 섹션의 이론적 근거를 참조하십시오.
ARC가 불균형 유지 또는 방출을 각각 방출하도록 설득하기 위해 순수하게
__bridge_retained
또는__bridge_transfer
캐스트를 사용하는 것은 좋지 않은 형태입니다.
어떤 상황에서 각각을 사용해야합니까?
예를 들어, CAGradientLayer
가지고 colors
배열 허용 속성 CGColorRef
들. 내 생각에 나는 __brige
여기서 사용해야 하지만 정확히 왜 내가 해야하는지 (또는 그렇지 않아야하는지) 불분명합니다.