Jan 042013
 

Objective-CのARC環境での型変換。CoreFoundation(CF変数)との__bridgeでの型変換(キャスト)まとめ。__bridgeと__bridge_retainedと__bridge_transferの簡単な説明。

ARC

  • NS環境(Objective-C言語環境)ではARC環境と非ARC環境の2つが存在する
  • ARC環境/非ARC環境ではallocできる
  • ARC環境ではretainできない
  • ARC環境ではreleaseできない
  • CF環境(C言語環境)CoreFoundationではARC環境は存在しない
  • CF環境(C言語環境)CoreFoundationではプログラマによるretain/releaseが必要
  • CFの変数とARC環境のObjective-C変数との型変換(キャスト)ができる

キャスト

次の3つがある。

__bridge(NS→CF)

  • NS変数は自動解放(ARCなので)
  • CF変数は自動解放(NS変数が破棄された時点で)
NSString *name = @"Skytree";
CFStringRef nameRef = (__bridge CFStringRef)name;//0のまま、nameの破棄で自動解放

__bridge_retained(NS→CF)

  • NS変数は自動解放(ARCなので)
  • CF変数は+1されている
NSString *name = @"Skytree";
CFStringRef nameRef = (__bridge_retained CFStringRef)name;//nameRefは+1されている
//(つまりは?自分でnameRefの-1必要)

__bridge_transfer(CF→NS)

  • CF変数は-1されている
  • NS変数は自動解放(ARCなので)
CFStringRef nameRef = CFStringCreateMutableCopy(alloc, 0, CFSTR("Skytree"));
//CF変数はallocにより+1されているが...

NSString *name = (__bridge_transfer NSString*)nameRef;
//nameRefはここで-1されている(解放不要)

http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html

コメント

個のコメント

Powered by Facebook Comments

 Posted by at 10:32

Sorry, the comment form is closed at this time.