flasherがはじめてiOS開発をしてみて

  • 2,270 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,270
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
2
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. はじめてのiOS開発
  • 2. はじめてのiOS開発 iOS開発の醍醐味をflash開発してきた人間からの視点で 簡単にまとめました。
  • 3. はじめてのiOS開発• メモリ管理• 画像キャッシュ• マルチスレッド処理• iOSのバージョン、デバイスの違い
  • 4. メモリ管理
  • 5. メモリ管理flash開発におけるメモリ管理は・・・
  • 6. メモリ管理flash開発におけるメモリ管理は・・・ ガベージコレクション。
  • 7. メモリ管理 ガベージコレクション、つまり 使用しなくなったメモリをプログラム側が勝手に開放してくれる。 それによりメモリリークをふせぐ。
  • 8. メモリ管理iOS開発におけるメモリ管理は・・・
  • 9. メモリ管理 iOS開発におけるメモリ管理は・・・リファレンスカウントによるメモリ管理。
  • 10. メモリ管理リファレンスカウントによるメモリ管理とは・・・
  • 11. メモリ管理リファレンスカウントによるメモリ管理とは・・・ 簡単にいうと、
  • 12. メモリ管理リファレンスカウントによるメモリ管理とは・・・ 簡単にいうと、 確保(alloc)したメモリは 必要がなくなったら解放(release)する
  • 13. メモリ管理メモリの解放漏れがあると・・・
  • 14. メモリ管理メモリの解放漏れがあると・・・メモリリークが発生して・・・
  • 15. メモリ管理 メモリの解放漏れがあると・・・ メモリリークが発生して・・・アプリケーションがクラッシュ(落ちる > < )
  • 16. メモリ管理でも・・・
  • 17. メモリ管理ARCを採用
  • 18. メモリ管理ARCとは・・・
  • 19. メモリ管理 ARCとは・・・コンパイラがメモリ管理を行ってくれる!!
  • 20. メモリ管理 つまり 確保(alloc)したメモリは必要がなくなったら解放(release)する
  • 21. メモリ管理 つまり 確保(alloc)したメモリは必要がなくなったら解放(release)する releaseを書く必要がなくなった!
  • 22. メモリ管理これでメモリ管理については気にしなくてよくなった!?
  • 23. メモリ管理 もちろん楽にはなったが、全く気にしなくていいわけではない。。。
  • 24. メモリ管理例1)テーブルビューセルの再利用
  • 25. メモリ管理例1)テーブルビューセルの再利用
  • 26. メモリ管理 例1)テーブルビューの再利用- (UnitTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UnitTableViewCell *cell = (UnitTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"UnitTableViewCell"]; if (cell == nil) { NSLog(@"cellを新規に生成"); UINib* nib = [UINib nibWithNibName:@"UnitTableViewCell" bundle:nil]; NSArray* array = [nib instantiateWithOwner:nil options:nil]; cell = [array objectAtIndex:0]; } [cell setData:[_dataList objectAtIndex:indexPath.row]]; return cell;}
  • 27. メモリ管理 例1)テーブルビューの再利用- (UnitTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UnitTableViewCell *cell = (UnitTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"UnitTableViewCell"]; if (cell == nil) { NSLog(@"cellを新規に生成"); UINib* nib = [UINib nibWithNibName:@"UnitTableViewCell" bundle:nil]; NSArray* array = [nib instantiateWithOwner:nil options:nil]; cell = [array objectAtIndex:0]; } [cell setData:[_dataList objectAtIndex:indexPath.row]]; return cell;} セルがすでに生成されていれば、 セルはそのまま再利用して別のデータをセットしてあげる
  • 28. メモリ管理 例1)テーブルビューの再利用- (UnitTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UnitTableViewCell *cell = (UnitTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"UnitTableViewCell"]; if (cell == nil) { NSLog(@"cellを新規に生成"); UINib* nib = [UINib nibWithNibName:@"UnitTableViewCell" bundle:nil]; NSArray* array = [nib instantiateWithOwner:nil options:nil]; cell = [array objectAtIndex:0]; } [cell setData:[_dataList objectAtIndex:indexPath.row]]; return cell;} _canvas = [[CanvasView alloc] initWithUnitData:data.unitData]; [self addSubview:_canvas];
  • 29. メモリ管理 例1)テーブルビューの再利用- (UnitTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UnitTableViewCell *cell = (UnitTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"UnitTableViewCell"]; if (cell == nil) { NSLog(@"cellを新規に生成"); UINib* nib = [UINib nibWithNibName:@"UnitTableViewCell" bundle:nil]; NSArray* array = [nib instantiateWithOwner:nil options:nil]; cell = [array objectAtIndex:0]; } [cell setData:[_dataList objectAtIndex:indexPath.row]]; return cell;} _canvas = [[CanvasView alloc] initWithUnitData:data.unitData]; [self addSubview:_canvas]; このメソッド内でインスタンスを生成→メモリリーク!!
  • 30. 画像キャッシュ
  • 31. 画像キャッシュ flash開発ではサーバから取得する画像のファイルサイズは あまり気にしてこなかった
  • 32. 画像キャッシュiOS開発では
  • 33. 画像キャッシュ iOS開発では3G回線における画像の読み込み時間は かなりクリティカル。
  • 34. 画像キャッシュ画像が表示されるのに時間がかかる、こんなアプリやってられない!! ユーザが離れていく。。。
  • 35. 画像キャッシュより最適な画像キャッシュの機構をつくる
  • 36. 画像キャッシュ サーバ CDN ブラウザキャッシュ ユーザflash開発
  • 37. 画像キャッシュ サーバ サーバ CDN ブラウザキャッシュ ユーザ ユーザflash開発 iOS開発
  • 38. 画像キャッシュ サーバ サーバ CDN CDN ブラウザキャッシュ ユーザ ユーザflash開発 iOS開発
  • 39. 画像キャッシュ サーバ サーバ CDN CDN ディスクキャッシュ ブラウザキャッシュ ユーザ ユーザflash開発 iOS開発
  • 40. 画像キャッシュ サーバ サーバ CDN CDN ディスクキャッシュ ブラウザキャッシュ メモリキャッシュ ユーザ ユーザflash開発 iOS開発
  • 41. 画像キャッシュ サーバ サーバ CDN CDN 通信発生 通信しない ディスクキャッシュ ブラウザキャッシュ メモリキャッシュ ユーザ ユーザflash開発 iOS開発
  • 42. マルチスレッド処理
  • 43. マルチスレッド処理flash(ActionScript3.0)開発は シングルスレッド処理。
  • 44. マルチスレッド処理 iOS開発ではマルチスレッドプログラミングが可能。
  • 45. マルチスレッド処理マルチスレッドプログラミングって 必要なの??
  • 46. マルチスレッド処理 YES!
  • 47. マルチスレッド処理 描画やタッチイベント処理は メインスレッドで行われる。そのため画像の読み込み処理などは 別スレッドで行う。
  • 48. マルチスレッド処理これってどういうこと??
  • 49. マルチスレッド処理 画像を読み込みつつ、スクロールの操作ができていることがわかる
  • 50. マルチスレッド処理これってどういうこと??
  • 51. マルチスレッド処理これってどういうこと??→ 快適なユーザビリティ
  • 52. マルチスレッド処理どうやって書く??
  • 53. マルチスレッド処理 どうやって書く??GCD(Grand Central Dispatch)
  • 54. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });});
  • 55. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });}); たったこれだけ。
  • 56. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });}); たったこれだけ。 でも・・・
  • 57. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });}); 書き方間違えるとダメー。
  • 58. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });});並列処理してはいけないものをここに書くと・・・ EXE_BAD_ACCESS(ヌルポ)でクラッシュ。。。
  • 59. マルチスレッド処理dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //ここに別スレッドの処理 dispatch_async(dispatch_get_main_queue(), ^{ //ここにメインスレッドの処理 });});こちらに描画の更新処理を書いてあげないと、、、 画面が一切更新されない!!
  • 60. iOSのバージョン、デバイスの違い
  • 61. iOSのバージョン、デバイスの違い• iOS5.x. / 6.x.• 1,136 x 640 / 960 x 640 ピクセル解像度
  • 62. iOSのバージョン、デバイスの違い iOS5.x. / 6.x. による違い 一例
  • 63. iOSのバージョン、デバイスの違い iOS5.x. / 6.x. による違い 一例• “Auto Layout”機能• SNS関連フレームワーク• shouldAutorotateToInterfaceOrientationがiOS6で deprecatedに
  • 64. iOSのバージョン、デバイスの違い1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
  • 65. iOSのバージョン、デバイスの違い1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例 こういう対応したんだから そんな大変じゃないんじゃ ないの??
  • 66. iOSのバージョン、デバイスの違い1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
  • 67. iOSのバージョン、デバイスの違い1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
  • 68. ご清聴ありがとうございました。