Toll - free bridge

Post on 04-Jul-2015

118 views 2 download

description

Toll - free bridgeについて ARC環境でのテクニックなど

Transcript of Toll - free bridge

ちょっとだけ 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も思い出して!