arc of developer part2

34
ARC of a Developer Part.2 111122日火曜日

Upload: junpei-wada

Post on 04-Jul-2015

727 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Arc of developer part2

ARC of a Developer Part.2

11年11月22日火曜日

Page 2: Arc of developer part2

CoreFoundation

• C言語ベースのフレームワーク

QuartzCGxxCoreFoundation

CFxx

CoreAudio

11年11月22日火曜日

Page 3: Arc of developer part2

CocoaとCoreFoundation

• 実はCocoaのコア機能はCoreFoundationからきてる

• NSString -> NSCFString -> CFString

11年11月22日火曜日

Page 4: Arc of developer part2

Toll-free Bridge

• Cocoaのオブジェクトをコスト 0 でCoreFoundationにキャストできる

11年11月22日火曜日

Page 5: Arc of developer part2

CFは今までと何も変わらない

• CoreFoundationの中でやるぶんには今までと変わらない

• CocoaにCoreFoundationのオブジェクトを渡したり、逆をするときに注意が必要

CoreFoundationCFString

CocoaNSString

11年11月22日火曜日

Page 6: Arc of developer part2

id の Void * へのキャスト

id obj = [[NSObject alloc]init]; void *p = obj; id o = p; [o release];

ARCが無効ならこれらは合法

11年11月22日火曜日

Page 7: Arc of developer part2

ARCでは id -> Void * への暗黙変換はダメ

• 明示的にキャストする必要がある。

[super didReceiveMemoryWarning]; id obj = [[NSObject alloc]init]; void *p = (__bridge void *)obj; id o = (__bridge id) p;

11年11月22日火曜日

Page 8: Arc of developer part2

ブリッジで使われる修飾子

• __bridge

• __bridge_retained

• __bridge_transfar

11年11月22日火曜日

Page 9: Arc of developer part2

__bridge

• オーナーシップの移転はなし

• __unsafe_unretainedと同じ

void *p; { id obj = [[NSObject alloc]init]; p = (__bridge void *)obj; } // ここでpにアクセスすると危険

11年11月22日火曜日

Page 10: Arc of developer part2

__bridge_retained

• オーナーシップを渡す

void *p; { id obj = [[NSObject alloc]init]; p = (__bridge_retained void *)obj; } // ここでpにアクセスしてもいいよ CFRelease(p);

11年11月22日火曜日

Page 11: Arc of developer part2

__bridge_transfar

• オーナーシップの付け替え

• キャスト元からキャスト先にオーナーシップを移動する

CFStringRef p; { id obj = [[NSObject alloc]init]; p = (__bridge_retained CFStringRef)obj; } id obj2 = (__bridge_transfer id)p;

11年11月22日火曜日

Page 12: Arc of developer part2

CFBridgingRetainとCFBridgingReleaseもある

• 便利(?)関数

• CFBridgingRetainと__bridge_retainedはおんなじ

• CGBridgingReleaseと__bridge_transferはおんなじ

NS_INLINE CF_RETURNS_RETAINED CFTypeRef CFBridgingRetain(id X) { return (__bridge_retained CFTypeRef)X;}

NS_INLINE id CFBridgingRelease(CFTypeRef CF_CONSUMED X) { return (__bridge_transfer id)X;}

11年11月22日火曜日

Page 13: Arc of developer part2

CFとのやり取りは注意する

• CoreFoundationとのやり取りはやはり参照カウントに注意する必要がある

• むしろARC以前よりわかりにくいかも

11年11月22日火曜日

Page 14: Arc of developer part2

BlocksとARC

• 循環参照の危険

• ちょっと説明するのに僕の理解が不足してまんなぁ・・・ごめんね

11年11月22日火曜日

Page 15: Arc of developer part2

軟弱プログラマのGitのすすめ

11年11月22日火曜日

Page 16: Arc of developer part2

ソースのバージョン管理

• ソースコードの変更履歴を残す

• どこをどう修正したか後で分かる

• コミットにコメントを書くことで変更の意味がわかりやすくなる

11年11月22日火曜日

Page 17: Arc of developer part2

バージョン管理のシステム

• CVS

• Subversion

• Visual Source Safe

• Git

11年11月22日火曜日

Page 18: Arc of developer part2

Gitさんがおすすめ

• 最後発のソース管理ソフト

• Linuxカーネルの開発者、Linus Torvaldsにより書かれた

• 速い!

• タダ!

• Xcode4にもビルトイン

11年11月22日火曜日

Page 19: Arc of developer part2

バージョン管理ソフトの種類

• 中央集権型

• CVSのためにサーバが必要

• ネットがない場所ではソース管理ができない

• 分散型

• 完全なリポジトリを各々が持つ

• マージ、ブランチが簡単

11年11月22日火曜日

Page 20: Arc of developer part2

中央集権型

リポジトリ

ユーザー ユーザー

checkin checkout

11年11月22日火曜日

Page 21: Arc of developer part2

分散型

リポジトリ

ユーザー

リポジトリ

ユーザー

リポジトリ

sync

11年11月22日火曜日

Page 22: Arc of developer part2

Gitさんのなにがいいか

• 細かくコミットしても他の人の迷惑にならない

• 細かいコミットは自分のリポジトリにコミット

• 区切りがついたらリモートリポジトリにSyncする

• 朝起きてSyncしたらコンパイルできねー!とかが起こりにくいよ

• サーバがぶっこわけても、ローカルに完全なコピーがあるよ

11年11月22日火曜日

Page 23: Arc of developer part2

複数人での作業

• バージョン管理がないとマージが大変だよね

• どれが最新バージョンかわからんくなる

• 誰かが手動でマージしないといけない

11年11月22日火曜日

Page 24: Arc of developer part2

Gitならそれ自動でできるよ!

• 自動マージ

• たまにコンフリクトするけど、対処すればいいよ

• 当然どれが最新かわからなくなることもないよ

11年11月22日火曜日

Page 25: Arc of developer part2

自動マージ

リポジトリ

リポジトリ親分

リポジトリ

! touchView = [[TouchDetectView alloc]initWithFrame:mapView.frame];! [self.view insertSubview:touchView atIndex:0];! touchView.delegate = self;! touchView.viewTouched = mapView;! mapView.frame = CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height);! [touchView addSubview:mapView];! mapView.showsUserLocation = NO;

Aのリポジトリ Bのリポジトリ

11年11月22日火曜日

Page 26: Arc of developer part2

自動マージ

リポジトリ

リポジトリ親分

リポジトリ

! touchView = [[TouchDetectView alloc]initWithFrame:mapView.frame];! [self.view insertSubview:touchView atIndex:0];! touchView.delegate = self;! touchView.viewTouched = mapView;! mapView.frame = CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height);! [touchView addSubview:mapView];

ちょっと変更したぞ

! mapView.showsUserLocation = NO;

Aのリポジトリ Bのリポジトリ

11年11月22日火曜日

Page 27: Arc of developer part2

自動マージ

リポジトリ

リポジトリ親分

リポジトリ

このへんに変更点をついかしたぞ

! touchView = [[TouchDetectView alloc]initWithFrame:mapView.frame];! [self.view insertSubview:touchView atIndex:0];! touchView.delegate = self;! touchView.viewTouched = mapView;! mapView.frame = CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height);! [touchView addSubview:mapView];! mapView.showsUserLocation = NO;

Aのリポジトリ Bのリポジトリ

11年11月22日火曜日

Page 28: Arc of developer part2

自動マージ

リポジトリ

リポジトリ親分

リポジトリこのへんに変更点をついかしたぞ

! touchView = [[TouchDetectView alloc]initWithFrame:mapView.frame];! [self.view insertSubview:touchView atIndex:0];! touchView.delegate = self;! touchView.viewTouched = mapView;! mapView.frame = CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height);! [touchView addSubview:mapView];

ちょっと変更したぞ

! mapView.showsUserLocation = NO;

Aのリポジトリ Bのリポジトリ

11年11月22日火曜日

Page 29: Arc of developer part2

ナイスなツールがあるよ

• Github for Mac

11年11月22日火曜日

Page 30: Arc of developer part2

コマンド打たなくて(多分)いい

• デザイナーとの協調作業はコマンドという大敵が!

• ビジュアルツールが必要

11年11月22日火曜日

Page 31: Arc of developer part2

そんなわけで

• デザイナーとプログラマーとで協調作業しやすいよ

• 朝起きてPullしたら画面が綺麗になってたりして楽しいw

11年11月22日火曜日

Page 32: Arc of developer part2

GitHubちょっとすごい

• Gitのリポジトリをホスティングしてくれます

• オープンソースなプロジェクトなら無料で使えます

• プライベートリポジトリを持つには有料だよ!

11年11月22日火曜日

Page 33: Arc of developer part2

Github Enterpriseもあるでよ

11年11月22日火曜日

Page 34: Arc of developer part2

脇道にそれてごめんね、おしまい

11年11月22日火曜日