SlideShare a Scribd company logo
プロの力を身につけるiPhone/iPad
アプリケーションの教科書
輪読資料
1-2 オブジェクト指向プログラミングのコツ
1-3 メモリ管理とオブジェクト指向
「クラス」と「オブジェクト」の違い
クラスとメモリの関係
オブジェクトとメモリの関係
メモリ4領域
プログラム実行領
域コンパイル後の実行コー
ド
スタック領域
ローカル変数
メソッドの引数、戻り値
静的領域
グローバル変数
静的変数
ヒープ領域
クラス定義
オブジェクト
スタック?ヒープ?
スタック領域
文字通り、スタック構造でローカル変数やメソッドの情報が
保存される
関数Aを実行
関数Aの
情報
関数Aから
関数Bを実行
関数Aの
情報
関数Bの
情報
関数Aから
関数Bを実行
関数Aの
情報
関数Bの
情報
ヒープ領域
動的にメモリ確保が可能な領域。データ構造のヒープ
とは関係がない!
双方向リストで構成、各ノードを「使用中」と「未使
用」に分けられている。
使うときは、未使用から切り出して使う
使用が終わったらメモリ解放関数などでラベルを未使
用に書き換える
ヒープ領域
前のアド
レス
次のアド
レス
データ
双方向リスト
ヒープ領域
前のアド
レス
次のアド
レス
データ
双方向リスト
前のアド
レス
次のアド
レス
データ
前のアド
レス
次のアド
レス
データ 前のアド
レス
次のアド
レス
データ
ヒープ領域
未使用 未使用 未使用 未使用 未使用 未使用 未使用 未使用 未使用
使用中 使用中 使用中 使用中 使用中 使用中 使用中 未使用 未使用
はじめの状態
メモリを切り出し
クラスAの情報 クラスBの情報
クラスCの情
報
endstart
ヒープ領域拡大
使用中 使用中 使用中 使用中 使用中 使用中 使用中 未使用 未使用
メモリが足りないとき
クラスAの情報 クラスBの情報
クラスCの情
報
使用中 使用中 使用中 使用中 使用中 使用中 使用中 未使用 未使用
クラスAの情報 クラスBの情報
クラスCの情
報
未使用 未使用
OSに領域拡大要求
クラスDの情
報
メモリの解放
使用中 使用中 使用中 使用中 使用中 使用中 使用中 未使用 未使用
メモリ使用中
クラスAの情報 クラスBの情報
クラスCの情
報
使用中 使用中 使用中 未使用 未使用 使用中 使用中 未使用 未使用
メモリを解放
クラスAの情報
クラスCの情
報
双方向リストで接続
メモリの問題1
使用中 使用中使用中 未使用 未使用 未使用 未使用
小さい領域は未使用領域に結合されない
使用中 未使用 未使用
どこからも参照されない
ガベージ
ガベージで分断され、連続した未使用領域が
確保できない状態
フラグメンテーション状態
メモリの問題2
使用中 使用中使用中
メモリの解放のし忘れ
使用中
メモリの解放をせず、確保したままのために
メモリが不足する状態
メモリリーク
使用中 使用中 使用中 使用中 使用中 使用中
クラスAの情報 クラスBの情報
クラスCの情
報
クラスDの情
報
もう使わないのに残ってる
メモリ4領域
プログラム実行領
域コンパイル後の実行コー
ド
スタック領域
ローカル変数
メソッドの引数、戻り値
静的領域
グローバル変数
静的変数
ヒープ領域
クラス定義
オブジェクト
プログラム実行領
域
スタック領域
静的領域
ヒープ領域
メモリ全体
アドレス
上位?
下位?
空き
プログラム実行領
域
スタック領域
静的領域
ヒープ領域
メモリ全体
アドレス
上位?
下位?
空き
メモリとオブジェクト
変数はスタック
以下はヒープに
• クラスの情報(クラス名、親クラス情報)
• インスタンス変数の情報(変数のサイズ、リスト)
• メソッドの情報(メソッドのリスト)
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報request変数
HTTPRequest *request;
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報request変数
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
メソッド戻り値allocメソッド
①
②
③
HTTPRequest *request;
request = [HttpRequest alloc];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報request変数=00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
http://www.apple.com
アドレス:00FFFF01
メソッドの引数initWithURL
HTTPRequest *request;
request = [HttpRequest alloc];
request = [request
initWithURL:@“http://apple.com”];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報request変数=00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
http://www.apple.com
アドレス:00FFFF01
メソッド戻り値startRequest
①
②
③
HTTPRequest *request;
request = [HttpRequest alloc];
request = [request
initWithURL:@“http://apple.com”];
[request startRequest] ;
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報request変数
1=00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
http://www.apple.com
アドレス:00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
http://www.apple.com
アドレス:00FFFF01
request変数2=00FFFF02
メモリ管理とオブジェクト指向
ARC以前のメモリ管理の仕組みを理解して
おこう
参照カウント方式
オーナーシップポリシー
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
request変数
1=00FFFF01
HTTPRequest *request1
= [[HttpRequest alloc] initwithURL:@“apple”]
参照カウント1
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
request変数
1=00FFFF01
request変数2=00FFFF01
HTTPRequest *request1
= [[HttpRequest alloc] initwithURL:@“apple”];
HTTPRequest *request2
= [request1 retain];
参照カウント2
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
request変数2=00FFFF01
HTTPRequest *request1
= [[HttpRequest alloc] initwithURL:@“apple”];
HTTPRequest *request2
=[request1 retain];
参照カウント1
[request1 release];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
HTTPRequest *request1
= [[HttpRequest alloc] initwithURL:@“apple”];
HTTPRequest *request2
=[request1 retain];
参照カウント0
[request1 release];
[request2 release];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
アドレス:00FFFF01
HTTPRequest *request1
= [[HttpRequest alloc] initwithURL:@“apple”];
HTTPRequest *request2
=[request1 retain];
[request1 release];
[request2 release];
オーナーシップポリシー
allocで始まる名称でオブジェクトを生成した
ものは、オブジェクトの所有者になる
自身で生成していないオブジェクトを所有す
るには、retainメソッドを使ってオーナーシッ
プを取得できる
オーナーシップポリシー
所有しているオブジェクトを使わなくなった
ときは、releaseメソッドを呼んでオーナーシ
ップを放棄する必要がある
所有していないオブジェクトのオーナーシッ
プを放棄してはいけない(所有していないオ
ブジェクトのreleaseメソッドを呼んではいけ
ない)
ここまでARC以前のお
話
ここからARCでの話
ARCでの参照
強い参照 strong
オーナーシップを持つ。デフォルト
弱い参照 weak
オーナーシップなし。強い参照がある前提で使う。
強い参照がなくなったら、nilになる
copy
オブジェクトをコピーして、それに対してオーナーシップを持つ
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
アドレス:00FFFF01
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
Strong
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
アドレス:00FFFF01
weakObject=00FFFF01
_weak HTTPRequest *weakObject
= strongObject;
weak
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
アドレス:00FFFF01
weakObject=00FFFF01
_weak HTTPRequest *weakObject
= strongObject;
weak
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
strongObject
= [[HttpRequest alloc] initwithURL:@“google”];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
weakObject=00FFFF01
_weak HTTPRequest *weakObject
= strongObject;
weak
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
nil
strongObject
= [[HttpRequest alloc] initwithURL:@“google”];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
“google”
アドレス:00FFFF01
weakObject=00FFFF01
_weak HTTPRequest *weakObject
= strongObject;
weak
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
nil
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
strongObject
= [[HttpRequest alloc] initwithURL:@“google”];
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
アドレス:00FFFF01
copyObject=00FFFF02
_copy HTTPRequest *copyObject
= strongObject;
copy
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
アドレス:00FFFF02
スタック ヒープ
Main関数
httpRequestクラス情報
• クラス情報
• インスタンス変数情報
• メソッドの情報
httpRequestオブジェクト
・クラス情報へのポインタ
“google”
アドレス:00FFFF01
copyObject=00FFFF02
_copy HTTPRequest *copyObject
= strongObject;
copy
HTTPRequest *strongObject
= [[HttpRequest alloc] initwithURL:@“apple”];
strongObject=00FFFF01
httpRequestオブジェクト
・クラス情報へのポインタ
“apple”
アドレス:00FFFF02
strongObject
= [[HttpRequest alloc] initwithURL:@“google”];

More Related Content

More from Yota Ishida

ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
Yota Ishida
 
ディープラーニングゼミ応用編2
ディープラーニングゼミ応用編2ディープラーニングゼミ応用編2
ディープラーニングゼミ応用編2
Yota Ishida
 
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
Yota Ishida
 
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
Yota Ishida
 
FrigeAir 冷蔵庫の中身をいつでも確認
FrigeAir 冷蔵庫の中身をいつでも確認FrigeAir 冷蔵庫の中身をいつでも確認
FrigeAir 冷蔵庫の中身をいつでも確認
Yota Ishida
 
おうちぐらし! 〜超実用的おうちハック手法〜
おうちぐらし! 〜超実用的おうちハック手法〜おうちぐらし! 〜超実用的おうちハック手法〜
おうちぐらし! 〜超実用的おうちハック手法〜
Yota Ishida
 
俺の部屋がこんなに賢いわけがない
俺の部屋がこんなに賢いわけがない俺の部屋がこんなに賢いわけがない
俺の部屋がこんなに賢いわけがない
Yota Ishida
 
HVCのある暮らし
HVCのある暮らしHVCのある暮らし
HVCのある暮らし
Yota Ishida
 
TMCN 総会vol.11 LT資料
TMCN 総会vol.11 LT資料TMCN 総会vol.11 LT資料
TMCN 総会vol.11 LT資料
Yota Ishida
 
IRKitで少し未来のスマートハウスに
IRKitで少し未来のスマートハウスにIRKitで少し未来のスマートハウスに
IRKitで少し未来のスマートハウスに
Yota Ishida
 

More from Yota Ishida (10)

ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
 
ディープラーニングゼミ応用編2
ディープラーニングゼミ応用編2ディープラーニングゼミ応用編2
ディープラーニングゼミ応用編2
 
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践ディープラーニングゼミ TensorFlowで学ぶ理論と実践
ディープラーニングゼミ TensorFlowで学ぶ理論と実践
 
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
ご注文はテレビONですか?? 〜ジェスチャを用いた家電制御〜
 
FrigeAir 冷蔵庫の中身をいつでも確認
FrigeAir 冷蔵庫の中身をいつでも確認FrigeAir 冷蔵庫の中身をいつでも確認
FrigeAir 冷蔵庫の中身をいつでも確認
 
おうちぐらし! 〜超実用的おうちハック手法〜
おうちぐらし! 〜超実用的おうちハック手法〜おうちぐらし! 〜超実用的おうちハック手法〜
おうちぐらし! 〜超実用的おうちハック手法〜
 
俺の部屋がこんなに賢いわけがない
俺の部屋がこんなに賢いわけがない俺の部屋がこんなに賢いわけがない
俺の部屋がこんなに賢いわけがない
 
HVCのある暮らし
HVCのある暮らしHVCのある暮らし
HVCのある暮らし
 
TMCN 総会vol.11 LT資料
TMCN 総会vol.11 LT資料TMCN 総会vol.11 LT資料
TMCN 総会vol.11 LT資料
 
IRKitで少し未来のスマートハウスに
IRKitで少し未来のスマートハウスにIRKitで少し未来のスマートハウスに
IRKitで少し未来のスマートハウスに
 

オブジェクト指向とメモリ管理