toll - free bridge
DESCRIPTION
Toll - free bridgeについて ARC環境でのテクニックなどTRANSCRIPT
ちょっとだけ Toll - free bridge
2014/05/24 Boost.勉強会 #15 札幌 LT わたなべ
@Susan_jacko
自己紹介
Twitter @Susan_jacko
お仕事 アプリエンジニア…(?)
ほっとさんからのプレッシャー
マイブーム → スープカレー
Toll - free bridge
相互変換 Objective-C ←→ C/C++
正しくは Foundation ←→ Core Foundation
こんなん出来ます!
キャストするだけ
実はどちらもC構造体
CFStringRef cfStr = CFSTR("boost"); NSString *nsStr = (NSString*)cfStr; NSLog(@"%@", nsStr);
やっぱり今は出来ません
Automatic Reference Counting
Objective-Cは面倒みてくれる
CFStringRef cfStr = CFSTR("boost"); NSString *nsStr = (NSString*)cfStr; NSLog(@"%@", nsStr);
__bridge 修飾子
Foundation ←→ Core Foundation どっち方向もOK
参照カウント ±0
CFStringRef cfStr; NSString *nsStr = (__bridge NSString*)cfStr; cfStr = (__bridge CFStringRef)nsStr; NSLog(@"%@", nsStr);
__bridge_retained 修飾子
Foundation → Core Foundation
参照カウント +1
NSString *nsStr; CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; CFShow(cfStr);
__bridge_transfer 修飾子
Core Foundation → Foundation
参照カウント -1
CFStringRef cfStr; NSString *nsStr = (__bridge_transfer NSString*)cfStr; NSLog(@"%@", nsStr);
こんな使い方
NSString* tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ return (__bridge_transfer NSString*)cfStr; }
これはリークしてる
CFStringRef tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ return cfStr; }
これでもOKCFStringRef tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ __autoreleasing NSString *nsStr2 = (__bridge_transfer NSString*)cfStr; return (__bridge CFStringRef)nsStr2; }
まとめ
ARC環境では __bridgeを付ける
__bridge_retainedした後は__bridge_transfer
設計次第では__autoreleasingも思い出して!