PIYO - Tech & Life -

__bridgeキャスト

Objective-C Xcode

C++をある程度知っているというものあってObjective-Cの言語的なところはほぼスキップしてiOSの開発をしているという側面が僕にはあります。

で、Xcodeの警告でたまに出てくる__bridgeキャストってなんじゃいなと思いながらもIDEに任せて直してもらっていたのですが…

さすがにそれじゃまずいよねということで少し調べました。

まず、Objective-CにはFoundationフレームワークのオブジェクトがObjective-Cオブジェクト、CoreFoundationフレームワークのオブジェクトをCoreFoundationオブジェクトがあります。

これらは内部的な違いはあまりないけれど、参照カウントの方法が微妙に違うということらしいです。ARCが無効の場合はこの差異は基本的には問題ありません。

最近のデフォルトとなっているARCが有効な場合、Objective-CオブジェクトはARCの管理対象になります。しかしCoreFoundationオブジェクトはARCの管理対象になりません。

そこで必要となるのが__bridgeキャストです。__bridgeキャストには3種類あります。

__bridge

このキャストは所有権を変えません。suggestionで1番目にするのもこれかな?

__bridge_retained

このキャストはObjective-CオブジェクトをCFオブジェクトが参照する場合に使います。ARCで管理されていたオブジェクトがARC管理外のCFオブジェクトにも参照されるため、CFで参照カウントを上げるわけです。

__bridge_transfer

このキャストは__bridge_retainedと逆で、CFオブジェクトをObjective-Cオブジェクトが参照する場合に使います。ARC管理外のオブジェクトがARC管理下におかれるので、参照カウントは減らします。

ちなみに、下2つは使う場面に遭遇したことはありません。