ARC環境下ではFoundationオブジェクトとCore Foundationオブジェクトのキャストによる変換はいろいろと面倒になっているので要注意。
基本的に、
- Foundation (NS):ARCの管理対象
- Core Foundation (CF):MRC
__bridge_transfer
CFBridgingRelease()
CFポインタ→ObjCポインタ、オーナーシップをMRCからARCへ変更
…CF→NSのときに使う
__bridge_retained
CFBridgingRetain()
ObjCポインタ→CFポインタ、オーナーシップをARCからMRCへ変更
…NS→CFのときに使う
__bridge
オーナーシップを変更せずにキャスト
CFDictionaryRef cfdict = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, NULL, NULL);
// どちらでも良い
NSDictionary *nsdict1 = (__bridge_transfer NSDictionary*)cfdict;
NSDictionary *nsdict2 = (NSDictionary*)CFBridgingRelease(cfdict);
// どちらでも良い
CFDictionaryRef *cfdict1 = (__bridge_retained CFDictionaryRef)@{};
CFDictionaryRef *cfdict2 = (CFDictionaryRef)CFBridgingRetain(@{});
// CF は解放
CFRelease(cfdict1);
CFRelease(cfdict2);
NSString *nskey = @"Which";
NSString *nsstr = @"Cocoa !";
CFMutableDictionaryRef cfdict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
// ARC なので __bridge でそのまま
CFDictionaryAddValue(cfdict, (__bridge CFStringRef)nskey), (__bridge CFStringRef)nsstr);
// CF は解放
CFRelease(cfdict);
明らかにキャストがおかしい場合は Xcode が補完してくれるけど。