arc of developer part2
TRANSCRIPT
ARC of a Developer Part.2
11年11月22日火曜日
CoreFoundation
• C言語ベースのフレームワーク
QuartzCGxxCoreFoundation
CFxx
CoreAudio
11年11月22日火曜日
CocoaとCoreFoundation
• 実はCocoaのコア機能はCoreFoundationからきてる
• NSString -> NSCFString -> CFString
11年11月22日火曜日
Toll-free Bridge
• Cocoaのオブジェクトをコスト 0 でCoreFoundationにキャストできる
11年11月22日火曜日
CFは今までと何も変わらない
• CoreFoundationの中でやるぶんには今までと変わらない
• CocoaにCoreFoundationのオブジェクトを渡したり、逆をするときに注意が必要
CoreFoundationCFString
CocoaNSString
11年11月22日火曜日
id の Void * へのキャスト
id obj = [[NSObject alloc]init]; void *p = obj; id o = p; [o release];
ARCが無効ならこれらは合法
11年11月22日火曜日
ARCでは id -> Void * への暗黙変換はダメ
• 明示的にキャストする必要がある。
[super didReceiveMemoryWarning]; id obj = [[NSObject alloc]init]; void *p = (__bridge void *)obj; id o = (__bridge id) p;
11年11月22日火曜日
ブリッジで使われる修飾子
• __bridge
• __bridge_retained
• __bridge_transfar
11年11月22日火曜日
__bridge
• オーナーシップの移転はなし
• __unsafe_unretainedと同じ
void *p; { id obj = [[NSObject alloc]init]; p = (__bridge void *)obj; } // ここでpにアクセスすると危険
11年11月22日火曜日
__bridge_retained
• オーナーシップを渡す
void *p; { id obj = [[NSObject alloc]init]; p = (__bridge_retained void *)obj; } // ここでpにアクセスしてもいいよ CFRelease(p);
11年11月22日火曜日
__bridge_transfar
• オーナーシップの付け替え
• キャスト元からキャスト先にオーナーシップを移動する
CFStringRef p; { id obj = [[NSObject alloc]init]; p = (__bridge_retained CFStringRef)obj; } id obj2 = (__bridge_transfer id)p;
11年11月22日火曜日
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日火曜日
CFとのやり取りは注意する
• CoreFoundationとのやり取りはやはり参照カウントに注意する必要がある
• むしろARC以前よりわかりにくいかも
11年11月22日火曜日
BlocksとARC
• 循環参照の危険
• ちょっと説明するのに僕の理解が不足してまんなぁ・・・ごめんね
11年11月22日火曜日
軟弱プログラマのGitのすすめ
11年11月22日火曜日
ソースのバージョン管理
• ソースコードの変更履歴を残す
• どこをどう修正したか後で分かる
• コミットにコメントを書くことで変更の意味がわかりやすくなる
11年11月22日火曜日
バージョン管理のシステム
• CVS
• Subversion
• Visual Source Safe
• Git
11年11月22日火曜日
Gitさんがおすすめ
• 最後発のソース管理ソフト
• Linuxカーネルの開発者、Linus Torvaldsにより書かれた
• 速い!
• タダ!
• Xcode4にもビルトイン
11年11月22日火曜日
バージョン管理ソフトの種類
• 中央集権型
• CVSのためにサーバが必要
• ネットがない場所ではソース管理ができない
• 分散型
• 完全なリポジトリを各々が持つ
• マージ、ブランチが簡単
11年11月22日火曜日
中央集権型
リポジトリ
ユーザー ユーザー
checkin checkout
11年11月22日火曜日
分散型
リポジトリ
ユーザー
リポジトリ
ユーザー
リポジトリ
sync
11年11月22日火曜日
Gitさんのなにがいいか
• 細かくコミットしても他の人の迷惑にならない
• 細かいコミットは自分のリポジトリにコミット
• 区切りがついたらリモートリポジトリにSyncする
• 朝起きてSyncしたらコンパイルできねー!とかが起こりにくいよ
• サーバがぶっこわけても、ローカルに完全なコピーがあるよ
11年11月22日火曜日
複数人での作業
• バージョン管理がないとマージが大変だよね
• どれが最新バージョンかわからんくなる
• 誰かが手動でマージしないといけない
11年11月22日火曜日
Gitならそれ自動でできるよ!
• 自動マージ
• たまにコンフリクトするけど、対処すればいいよ
• 当然どれが最新かわからなくなることもないよ
11年11月22日火曜日
自動マージ
リポジトリ
リポジトリ親分
リポジトリ
! 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日火曜日
自動マージ
リポジトリ
リポジトリ親分
リポジトリ
! 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日火曜日
自動マージ
リポジトリ
リポジトリ親分
リポジトリ
このへんに変更点をついかしたぞ
! 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日火曜日
自動マージ
リポジトリ
リポジトリ親分
リポジトリこのへんに変更点をついかしたぞ
! 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日火曜日
ナイスなツールがあるよ
• Github for Mac
11年11月22日火曜日
コマンド打たなくて(多分)いい
• デザイナーとの協調作業はコマンドという大敵が!
• ビジュアルツールが必要
11年11月22日火曜日
そんなわけで
• デザイナーとプログラマーとで協調作業しやすいよ
• 朝起きてPullしたら画面が綺麗になってたりして楽しいw
11年11月22日火曜日
GitHubちょっとすごい
• Gitのリポジトリをホスティングしてくれます
• オープンソースなプロジェクトなら無料で使えます
• プライベートリポジトリを持つには有料だよ!
11年11月22日火曜日
Github Enterpriseもあるでよ
11年11月22日火曜日
脇道にそれてごめんね、おしまい
11年11月22日火曜日