iPhone, iPad アプリ開発勉強会#2
Upcoming SlideShare
Loading in...5
×
 

iPhone, iPad アプリ開発勉強会#2

on

  • 1,578 views

iPhone, iPad アプリ開発勉強会#2 の為に作成した資料です。

iPhone, iPad アプリ開発勉強会#2 の為に作成した資料です。

Statistics

Views

Total Views
1,578
Views on SlideShare
989
Embed Views
589

Actions

Likes
1
Downloads
3
Comments
0

4 Embeds 589

http://d.hatena.ne.jp 575
http://localhost 12
http://app.unreadzero.com 1
https://www.google.co.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

iPhone, iPad アプリ開発勉強会#2 iPhone, iPad アプリ開発勉強会#2 Presentation Transcript

  • iPhone, iPad アプリ開発勉強会#212年12月7日金曜日
  • 一般的なアプリの構成 画面ひとつ分の構成 実行 通常は画面1つにつき、 ビュー (MyViewController.xib) •ビュー •ヘッダファイル @interface @imprementation MyViewController { •実装ファイル MyViewController { @private @synthesize *mView NSString *str - (id) init { } self = [super init]; で構成されます @prototyp(non... return self: } @end @end ヘッダファイル 実装ファイル (MyViewController.h) (MyViewController.m)12年12月7日金曜日
  • 一般的なアプリの構成 ビューが1つのとき それ以外では、アプリひとつにつき、 アプリケーションデリゲートが1つあ ります。 実行 ビュー アプリケーションデリゲート (MyViewController.xib) @interface @imprementation @imprementation @interface MyViewController { MyViewController { MyViewController { MyViewController { @private @synthesize *mView @synthesize *mView @private NSString *str NSString *str } - (id) init { - (id) init { } self = [super init]; self = [super init]; @prototyp(non... return self: return self: @prototyp(non... } } @end @end @end @end ヘッダファイル 実装ファイル ヘッダファイル 実装ファイル (MyViewController.h) (MyViewController.m) (MyAppViewDelegate.h) (MyAppDelegate.m)12年12月7日金曜日 View slide
  • 一般的なアプリの構成 ビューが2つのとき 実 ビュー アプリケーションデリゲートはアプリ全体で共有します @interfa @impre ce mentatio MyView n MyView ヘッダファイル 実装ファイル アプリケーションデリゲート @interface @imprementation 実 MyViewController { @private MyViewController { @synthesize *mView NSString *str ビュー } - (id) init { self = [super init]; @prototyp(non... return self: } @interfa @impre @end ce mentatio @end MyView n MyView ヘッダファイル 実装ファイル ヘッダファイル 実装ファイル (MyAppViewDelegate.h) (MyAppDelegate.m)12年12月7日金曜日 View slide
  • 一般的なアプリの構成 なんらかの機能を提供するクラス 実 @interfa ce @impre mentatio MyView n ビュー MyView ヘッダファイル 実装ファイル @interfa @impre ce mentatio MyView n MyView ヘッダファイル 実装ファイル アプリケーションデリゲート @interface @imprementation 実 MyViewController { @private MyViewController { @synthesize *mView NSString *str ビュー } - (id) init { self = [super init]; @prototyp(non... return self: } @interfa @impre @end ce mentatio @end MyView n MyView ヘッダファイル 実装ファイル ヘッダファイル 実装ファイル (MyAppViewDelegate.h) (MyAppDelegate.m)12年12月7日金曜日
  • 一般的なアプリ開発の流れ 1. XCodeでプロジェクト作成 2. ビューに部品(ボタン、テキストフィールド等...)を追加 3. ビューコントローラのヘッダファイルに@property(IBoutlet)宣言を追加 4. 実装ファイルに@synthesize宣言を追加 5. ビューのデザイン画面で、さきほど宣言したビューコントローラのプロパティと 実際の部品を繋ぐ。 6. コード中でビューの部品にアクセスする際には@property宣言した変数を通し て。 7. ボタンなどを配置してタップした時のアクションを定義する(次ページ)12年12月7日金曜日
  • 一般的なアプリ開発の流れ (アクションの定義)1. デザイン画面にアクションを起こすボタンなどを配置する。2. ビューコントローラのヘッダファイルにアクションのメソッド定義をする。3. ビューコントローラの実装ファイルにアクションを実装する。4. デザイン画面で、アクションと実際の部品を繋ぐ。5. ボタンなどを配置して、そのボタンをタップした時のアクションのコードを書く。6. コンパイル、動作を確認。12年12月7日金曜日
  • メモリ管理 Rubyと同様に、Objective-Cにおいてもクラスからインスタンスを作って使用します。 Rubyの場合 Objective-Cの場合 obj = Hoge.new Hoge *obj = [[Hoge alloc] init]; obj.sayhello #メソッド呼び出し [obj sayhello] /* メソッド呼び出し */ [obj release]; /* メモリを解放 */ /* または */ [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • もしメモリを解放しないと... アプリが使用中 10% 空きメモリ 90% 30% 5% 70% だんだんメモリ使用量が 増えていって... 40% 95% 60% iPhoneの持ってるメモリを 使い果たしてしまう! 40% 60% 実際にはそうなる前にiOS によりアプリが強制終了 されます。12年12月7日金曜日
  • メモリ解放するには、プログラム中で生成したオブジェクトを解放します。 オブジェクトは、誰にも使用されなくなったら解放します。 オブジェクトC オブジェクトA Hogeクラスのオブジェクト [[Hoge alloc] init] オブジェクトB オブジェクトが使われている(参照されている)状態12年12月7日金曜日
  • メモリ解放するには、プログラム中で生成したオブジェクトを解放します。 オブジェクトは、誰にも使用されなくなったら解放します。 オブジェクトC オブジェクトA Hogeクラスのオブジェクト オブジェクトB オブジェクトが使われていない(参照されていない)状態 こうなったら解放しちゃってもいい12年12月7日金曜日
  • でも、他のオブジェクトから使われているかどうかなんて、 どうやったらわかるのでしょう...12年12月7日金曜日
  • Objective-Cでのメモリ管理にはリファレンスカウンタを使用します リファレンスカウンタ オブジェクトC オブジェクトA 3 Hogeクラスのオブジェクト オブジェクトB オブジェクトが使われている(参照されている)状態12年12月7日金曜日
  • Objective-Cでのメモリ管理にはリファレンスカウンタを使用します リファレンスカウンタ オブジェクトC オブジェクトA 2 Hogeクラスのオブジェクト オブジェクトB オブジェクトが使われている(参照されている)状態12年12月7日金曜日
  • Objective-Cでのメモリ管理にはリファレンスカウンタを使用します リファレンスカウンタ オブジェクトC オブジェクトA 1 Hogeクラスのオブジェクト オブジェクトB オブジェクトが使われている(参照されている)状態12年12月7日金曜日
  • Objective-Cでのメモリ管理にはリファレンスカウンタを使用します リファレンスカウンタ オブジェクトC オブジェクトA 0 Hogeクラスのオブジェクト オブジェクトB 誰からも使われなくなったオブジェクトはリファレンスカウンタが0に!12年12月7日金曜日
  • Objective-Cでのメモリ管理にはリファレンスカウンタを使用します リファレンスカウンタ オブジェクトC オブジェクトA 0 Hogeクラスのオブジェクト オブジェクトB オブジェクトは解放されてなくなりました! リファレンスカウンタが0になったときの オブジェクトの解放はiOSにより自動的に行われます。12年12月7日金曜日
  • 実際のコードでみてみると... オブジェクトが生成された時点で、生成も リファレンスカウンタ とのオブジェクトの参照分、1がリファレ ンスカウンタにセットされます。 1 Hoge *obj = [[Hoge alloc] init]; Hogeクラスのオブジェクト [obj sayhello] /* メソッド呼び出し */ [obj release]; /* メモリを解放 */ /* または */ [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • 実際のコードでみてみると... オブジェクトが生成された時点で、生成も リファレンスカウンタ とのオブジェクトの参照分、1がリファレ ンスカウンタにセットされます。 0 Hoge *obj = [[Hoge alloc] init]; Hogeクラスのオブジェクト [obj sayhello] /* メソッド呼び出し */ [obj release]; /* メモリを解放 */ /* または */ オブジェクトに対してreleaseメソッドを呼ぶ事 でリファレンスカウンタの値が1引かれます。 [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • 実際のコードでみてみると... リファレンスカウンタ 0 Hoge *obj = [[Hoge alloc] init]; Hogeクラスのオブジェクト [obj sayhello] /* メソッド呼び出し */ [obj release]; /* メモリを解放 */ /* または */ オブジェクトに対してreleaseメソッドを呼ぶ事 でリファレンスカウンタの値が1引かれます。 [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • 複数のオブジェクトから参照されてると... Hoge *obj = [[Hoge alloc] init]; /* この時点でリファレンスカウンタは1 */ a.obj = obj; /* この時点でリファレンスカウンタは2 */ b.obj = obj; /* この時点でリファレンスカウンタは3 */ c.obj = obj; /* この時点でリファレンスカウンタは4 */ [obj release]; /* ここで-1されて3 */ .... /* aが解放される時にaがobjに対してreleaseを実行してカウンタは2に */ /* bが解放される時にbがobjに対してreleaseを実行してカウンタは1に */ /* cが解放される時にcがobjに対してreleaseを実行してカウンタは0に */ /* ここでオブジェクトは解放される */12年12月7日金曜日
  • 自動解放プールを使う方法 0 Hoge *obj = [[Hoge alloc] init]; Hogeクラスのオブジェクト [obj sayhello] /* メソッド呼び出し */ // [obj release]; /* メモリを解放 */ /* または */ [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • 自動解放プールを使う方法 0 Hoge *obj = [[Hoge alloc] init]; Hogeクラスのオブジェクト [obj sayhello] /* メソッド呼び出し */ // [obj release]; /* メモリを解放 */ /* または */ [obj autorelease]; /* これもメモリ解放 */12年12月7日金曜日
  • releaseとautorelease(自動解放プール)の違いは...?12年12月7日金曜日
  • releaseを使うと、カウンタはすぐに-1され、 0になった時点でオブジェクト(の使用するメモリは)即時解放されます。 リファレンスカウンタ オブジェクトC オブジェクトA release 3 release Hogeクラスのオブジェクト release オブジェクトB12年12月7日金曜日
  • releaseを使うと、カウンタはすぐに-1され、 0になった時点でオブジェクト(の使用するメモリは)即時解放されます。 リファレンスカウンタ オブジェクトC オブジェクトA 0 Hogeクラスのオブジェクト オブジェクトB オブジェクトは解放されてなくなりました! リファレンスカウンタが0になったときの オブジェクトの解放はiOSにより自動的に行われます。12年12月7日金曜日
  • autoreleaseを使うと、カウンタはすぐには-1されず、 従ってオブジェクト(が使用するメモリ)はすぐには解放されません。 リファレンスカウンタ オブジェクトC オブジェクトA autorelease 3 autorelease Hogeクラスのオブジェクト オブジェクトB autorelease12年12月7日金曜日
  • そのかわり、メモ用紙(自動解放プール)にその旨を記録しておきます。 オブジェクトC 自動解放プール オブジェクトA autorelease autorelease オブジェクトAが解放した。 3 オブジェクトBが解放した。 オブジェクトCが解放した。 Hogeクラスのオブジェクト メモ用紙(自動解放プール)に記録しておく オブジェクトB autorelease12年12月7日金曜日
  • autoreleaseを使うと、カウンタはすぐには-1されず、 従ってオブジェクト(が使用するメモリ)はすぐには解放されません。 オブジェクトC 自動解放プール オブジェクトA オブジェクトAが解放した。 3 0 オブジェクトBが解放した。 オブジェクトCが解放した。 Hogeクラスのオブジェクト オブジェクトB 自動解放プールが解放される時に メモされている「解放」が一斉に行われます。12年12月7日金曜日
  • autoreleaseを使うと、カウンタはすぐには-1されず、 従ってオブジェクト(が使用するメモリ)はすぐには解放されません。 オブジェクトC 自動解放プール オブジェクトA オブジェクトAが解放した。 0 オブジェクトBが解放した。 オブジェクトCが解放した。 Hogeクラスのオブジェクト オブジェクトB 自動解放プールが解放される時に メモされている「解放」が一斉に行われます。12年12月7日金曜日
  • autoreleaseを使うと、カウンタはすぐには-1されず、 従ってオブジェクト(が使用するメモリ)はすぐには解放されません。 オブジェクトC 自動解放プール オブジェクトA オブジェクトAが解放した。 0 オブジェクトAが解放した。 オブジェクトAが解放した。 Hogeクラスのオブジェクト オブジェクトB 自動解放プールも開放されます...12年12月7日金曜日
  • どう使い分ければ...12年12月7日金曜日
  • どう使い分ければ... メソッドの中でだけ使う、一時的なオブジェクトはメソッドから抜ける前に releaseで解放します。 - (void) hoge { NSArray * array = [[NSArray alloc] init]; /* 何か処理*/ [array release]; }12年12月7日金曜日
  • どう使い分ければ... メソッドの返り値として呼び出し元に返す値は、相手が受け取る前に解放してしまっては まずいので、autoreleaseを使います。 - (NSArray *) hoge { NSArray * array = [[NSArray alloc] init]; [array autorelease]; /* 何か処理*/ return array; }12年12月7日金曜日
  • どう使い分ければ... なお、次に説明するコンビニエンスコンストラクタを使えば なにもしなくてもautoreleaseを呼び出し済みのオブジェクトが得られます。 - (NSArray *) hoge { NSArray * array = [NSArray array]; /* 何か処理*/ return array; }12年12月7日金曜日
  • ちなみに、最も基本的なオブジェクト生成は [[クラス名 alloc] init]; で、この場合はreleaseまたはautoreleaseを明示的に呼んで解放してやる必要があります。 ただし、これとは別に [クラス名 小文字ではじまるクラス名~]; というオブジェクト生成方法もあり、この場合は既にautoreleaseが呼ばれた状態で オブジェクトが渡されます。 つまり... NSArray *array = [NSArray array]; は NSArray * array = [[NSArray alloc] init] [array autorelease]; と同じです。12年12月7日金曜日
  • ARC (オート・レファレンス・カウンタ)とは12年12月7日金曜日
  • iOS5から、ARCが使えるようになりました12年12月7日金曜日
  • ARCを使ってもオブジェクトの解放に関する考え方は変わりませんが...12年12月7日金曜日
  • ARC無しの場合 - (void) hoge { NSArray * array = [[NSArray alloc] init]; /* 何か処理*/ [array release]; } 使い終わったらreleaseしてやらないとメモリリーク!12年12月7日金曜日
  • ARCが有効の場合 - (void) hoge { NSArray * array = [[NSArray alloc] init]; /* 何か処理*/ } コンパイル と書いておけば... - (void) hoge { NSArray * array = [[NSArray alloc] init]; /* 何か処理*/ コンパイル時にコンパイラが勝手に追加してくれます! [array release]; } メモリにも開発者にも優しい(*´∀`*)12年12月7日金曜日
  • 今後はARCを有効にしておいて、[[クラス alloc] init] でオブジェクトを 生成しても解放忘れがなく、 かつARCによって自動挿入されたreleaseにより、 すぐにオブジェクトを解放してくれるのでこっちがいいかも。12年12月7日金曜日
  • RubyやJavaのGCとの違いは? GC(ガベージコレクション)はアプリ実行時に一定期間おきに メモリの掃除をします。 ARCは、コンパイル時にメモリの解放コードを自動挿入し、 実行時には自動的に何かをする事はありません。 ↓ GCが走らない分、処理が止まったりせず、より滑らかでスムーズな使用感が得られます!12年12月7日金曜日
  • おわり12年12月7日金曜日