SlideShare uma empresa Scribd logo
1 de 68
Baixar para ler offline
はじめてのiOS開発
はじめてのiOS開発




    iOS開発の醍醐味を
flash開発してきた人間からの視点で
   簡単にまとめました。
はじめてのiOS開発


•   メモリ管理

•   画像キャッシュ

•   マルチスレッド処理

•   iOSのバージョン、デバイスの違い
メモリ管理
メモリ管理




flash開発におけるメモリ管理は・・・
メモリ管理




flash開発におけるメモリ管理は・・・
   ガベージコレクション。
メモリ管理



  ガベージコレクション、つまり
   使用しなくなったメモリを
プログラム側が勝手に開放してくれる。
 それによりメモリリークをふせぐ。
メモリ管理




iOS開発におけるメモリ管理は・・・
メモリ管理




 iOS開発におけるメモリ管理は・・・
リファレンスカウントによるメモリ管理。
メモリ管理



リファレンスカウントによるメモリ管理とは・・・
メモリ管理



リファレンスカウントによるメモリ管理とは・・・
        簡単にいうと、
メモリ管理



リファレンスカウントによるメモリ管理とは・・・
        簡単にいうと、
     確保(alloc)したメモリは
  必要がなくなったら解放(release)する
メモリ管理




メモリの解放漏れがあると・・・
メモリ管理




メモリの解放漏れがあると・・・
メモリリークが発生して・・・
メモリ管理




   メモリの解放漏れがあると・・・
    メモリリークが発生して・・・
アプリケーションがクラッシュ(落ちる > < )
メモリ管理




でも・・・
メモリ管理




ARCを採用
メモリ管理




ARCとは・・・
メモリ管理




      ARCとは・・・
コンパイラがメモリ管理を行ってくれる!!
メモリ管理




         つまり
   確保(alloc)したメモリは
必要がなくなったら解放(release)する
メモリ管理




         つまり
   確保(alloc)したメモリは
必要がなくなったら解放(release)する


 releaseを書く必要がなくなった!
メモリ管理




これでメモリ管理については
気にしなくてよくなった!?
メモリ管理




   もちろん楽にはなったが、
全く気にしなくていいわけではない。。。
メモリ管理

例1)テーブルビューセルの再利用
メモリ管理

例1)テーブルビューセルの再利用
メモリ管理

                                 例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;
}
メモリ管理

                                 例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;
}




                          セルがすでに生成されていれば、
                          セルはそのまま再利用して別のデータをセットしてあげる
メモリ管理

                                 例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];
メモリ管理

                                 例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];

                           このメソッド内でインスタンスを生成→メモリリーク!!
画像キャッシュ
画像キャッシュ




      flash開発では
サーバから取得する画像のファイルサイズは
    あまり気にしてこなかった
画像キャッシュ




iOS開発では
画像キャッシュ




      iOS開発では
3G回線における画像の読み込み時間は
   かなりクリティカル。
画像キャッシュ




画像が表示されるのに時間がかかる、
こんなアプリやってられない!!
  ユーザが離れていく。。。
画像キャッシュ




より最適な画像キャッシュの機構をつくる
画像キャッシュ

 サーバ




       CDN




       ブラウザキャッシュ




 ユーザ

flash開発
画像キャッシュ

 サーバ                 サーバ




       CDN




       ブラウザキャッシュ




 ユーザ                 ユーザ

flash開発              iOS開発
画像キャッシュ

 サーバ                 サーバ




       CDN                 CDN




       ブラウザキャッシュ




 ユーザ                 ユーザ

flash開発              iOS開発
画像キャッシュ

 サーバ                 サーバ




       CDN                 CDN




                           ディスクキャッシュ
       ブラウザキャッシュ




 ユーザ                 ユーザ

flash開発              iOS開発
画像キャッシュ

 サーバ                 サーバ




       CDN                 CDN




                           ディスクキャッシュ
       ブラウザキャッシュ
                           メモリキャッシュ



 ユーザ                 ユーザ

flash開発              iOS開発
画像キャッシュ

 サーバ                       サーバ




       CDN                       CDN


                   通信発生

                   通信しない




                                 ディスクキャッシュ
       ブラウザキャッシュ
                                 メモリキャッシュ



 ユーザ                       ユーザ

flash開発                    iOS開発
マルチスレッド処理
マルチスレッド処理




flash(ActionScript3.0)開発は
   シングルスレッド処理。
マルチスレッド処理




      iOS開発では
マルチスレッドプログラミングが可能。
マルチスレッド処理




マルチスレッドプログラミングって
     必要なの??
マルチスレッド処理




   YES!
マルチスレッド処理



 描画やタッチイベント処理は
 メインスレッドで行われる。
そのため画像の読み込み処理などは
   別スレッドで行う。
マルチスレッド処理




これってどういうこと??
マルチスレッド処理




     画像を読み込みつつ、
スクロールの操作ができていることがわかる
マルチスレッド処理




これってどういうこと??
マルチスレッド処理




これってどういうこと??
→ 快適なユーザビリティ
マルチスレッド処理




どうやって書く??
マルチスレッド処理




     どうやって書く??
GCD(Grand Central Dispatch)
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});



                           たったこれだけ。
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});



                           たったこれだけ。
                                でも・・・
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});




                    書き方間違えるとダメー。
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});




並列処理してはいけないものをここに書くと・・・
 EXE_BAD_ACCESS(ヌルポ)でクラッシュ。。。
マルチスレッド処理



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //ここに別スレッドの処理

      dispatch_async(dispatch_get_main_queue(), ^{

            //ここにメインスレッドの処理

      });

});




こちらに描画の更新処理を書いてあげないと、、、
                   画面が一切更新されない!!
iOSのバージョン、デバイスの違い
iOSのバージョン、デバイスの違い




•   iOS5.x. / 6.x.

•   1,136 x 640 / 960 x 640 ピクセル解像度
iOSのバージョン、デバイスの違い

  iOS5.x. / 6.x. による違い 一例
iOSのバージョン、デバイスの違い

              iOS5.x. / 6.x. による違い 一例


•   “Auto Layout”機能

•   SNS関連フレームワーク

•   shouldAutorotateToInterfaceOrientationがiOS6で
    deprecatedに
iOSのバージョン、デバイスの違い

1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
iOSのバージョン、デバイスの違い

1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例




                             こういう対応したんだから
                             そんな大変じゃないんじゃ
                                  ないの??
iOSのバージョン、デバイスの違い

1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
iOSのバージョン、デバイスの違い

1,136 x 640 / 960 x 640 ピクセル解像度による違い 一例
ご清聴ありがとうございました。

Mais conteúdo relacionado

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

データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
 
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
Hibino Hisashi
 

Semelhante a flasherがはじめてiOS開発をしてみて (20)

データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
Swift入門
Swift入門Swift入門
Swift入門
 
Canvas勉強会
Canvas勉強会Canvas勉強会
Canvas勉強会
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
はじめての Azure 開発
はじめての Azure 開発はじめての Azure 開発
はじめての Azure 開発
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
Jsのビルド環境
Jsのビルド環境Jsのビルド環境
Jsのビルド環境
 
UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!UICollectionViewLayoutでカバーフローを作りたい!
UICollectionViewLayoutでカバーフローを作りたい!
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
 
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
【第20回セキュリティ共有勉強会】Amazon FSx for Windows File Serverをセキュリティ観点で試してみたお話
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
 
Mvc conf session_5_isami
Mvc conf session_5_isamiMvc conf session_5_isami
Mvc conf session_5_isami
 
Blocksの活用法
Blocksの活用法Blocksの活用法
Blocksの活用法
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版
 
Swiftyを試す
Swiftyを試すSwiftyを試す
Swiftyを試す
 
Sails.jsのメリット・デメリット
Sails.jsのメリット・デメリットSails.jsのメリット・デメリット
Sails.jsのメリット・デメリット
 

Mais de 佐藤 俊太郎

Createjsについて@jsCafe20
Createjsについて@jsCafe20Createjsについて@jsCafe20
Createjsについて@jsCafe20
佐藤 俊太郎
 

Mais de 佐藤 俊太郎 (9)

iOSオジサンは JSオジサンを これからも覗きにくる
iOSオジサンは JSオジサンを これからも覗きにくるiOSオジサンは JSオジサンを これからも覗きにくる
iOSオジサンは JSオジサンを これからも覗きにくる
 
Source kittenについて
Source kittenについてSource kittenについて
Source kittenについて
 
Bond の v4 について
Bond の v4 についてBond の v4 について
Bond の v4 について
 
`redux`と`flux`を比べてみたときの個人的な感想
`redux`と`flux`を比べてみたときの個人的な感想`redux`と`flux`を比べてみたときの個人的な感想
`redux`と`flux`を比べてみたときの個人的な感想
 
小さな会社(チーム)で クールなアプリをつくる方法 Gunosy UI Design Study #1
小さな会社(チーム)で クールなアプリをつくる方法 Gunosy UI Design Study #1小さな会社(チーム)で クールなアプリをつくる方法 Gunosy UI Design Study #1
小さな会社(チーム)で クールなアプリをつくる方法 Gunosy UI Design Study #1
 
yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」
yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」
yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」
 
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
サーバサイドで動的にhtml生成していたりjQueryをガッツし使っている既存プロジェクトにAngularJSを部分的につっこんでみた @jscafe21
 
Createjsについて@jsCafe20
Createjsについて@jsCafe20Createjsについて@jsCafe20
Createjsについて@jsCafe20
 
Introduction for cocos2d
Introduction for cocos2dIntroduction for cocos2d
Introduction for cocos2d
 

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