Toll - free bridge

12
ちょっとだけ Toll - free bridge 2014/05/24 Boost. 勉強会 #15 札幌 LT わたなべ @Susan_jacko

description

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

Transcript of Toll - free bridge

Page 1: Toll - free bridge

ちょっとだけ Toll - free bridge

2014/05/24 Boost.勉強会 #15 札幌 LT わたなべ

@Susan_jacko

Page 2: Toll - free bridge

自己紹介

Twitter @Susan_jacko

お仕事 アプリエンジニア…(?)

ほっとさんからのプレッシャー

マイブーム → スープカレー

Page 3: Toll - free bridge

Toll - free bridge

相互変換 Objective-C ←→ C/C++

正しくは Foundation ←→ Core Foundation

Page 4: Toll - free bridge

こんなん出来ます!

キャストするだけ

実はどちらもC構造体

CFStringRef cfStr = CFSTR("boost"); NSString *nsStr = (NSString*)cfStr; NSLog(@"%@", nsStr);

Page 5: Toll - free bridge

やっぱり今は出来ません

Automatic Reference Counting

Objective-Cは面倒みてくれる

CFStringRef cfStr = CFSTR("boost"); NSString *nsStr = (NSString*)cfStr; NSLog(@"%@", nsStr);

Page 6: Toll - free bridge

__bridge 修飾子

Foundation ←→ Core Foundation どっち方向もOK

参照カウント ±0

CFStringRef cfStr; NSString *nsStr = (__bridge NSString*)cfStr; cfStr = (__bridge CFStringRef)nsStr; NSLog(@"%@", nsStr);

Page 7: Toll - free bridge

__bridge_retained 修飾子

Foundation → Core Foundation

参照カウント +1

NSString *nsStr; CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; CFShow(cfStr);

Page 8: Toll - free bridge

__bridge_transfer 修飾子

Core Foundation → Foundation

参照カウント -1

CFStringRef cfStr; NSString *nsStr = (__bridge_transfer NSString*)cfStr; NSLog(@"%@", nsStr);

Page 9: Toll - free bridge

こんな使い方

NSString* tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ return (__bridge_transfer NSString*)cfStr; }

Page 10: Toll - free bridge

これはリークしてる

CFStringRef tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ return cfStr; }

Page 11: Toll - free bridge

これでもOKCFStringRef tfbSample(NSString *nsStr) { CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; /* かくかくしかじか */ __autoreleasing NSString *nsStr2 = (__bridge_transfer NSString*)cfStr; return (__bridge CFStringRef)nsStr2; }

Page 12: Toll - free bridge

まとめ

ARC環境では __bridgeを付ける

__bridge_retainedした後は__bridge_transfer

設計次第では__autoreleasingも思い出して!