はじめての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 ピクセル解像度による違い 一例
ご清聴ありがとうございました。

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