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つは使う場面に遭遇したことはありません。