2011年3月6日日曜日
メモリ不足への対処
組み込み型OSであるiOSの実装にあたり、メモリ管理を確実に行うことは可用性を保つ上で重要だ。”UIKit詳細リファレンス”に良い解説があった。メモリ不足対処には、didReceiveMemoryWarningが呼ばれることは周知だが、OS3.0からはviewDidUnloadが呼ばれるため、ここにコードすることになる。didRecieveMemoryWarningは、メモリ不足時に常に呼ばれるが、viewDidUnloadは前面にいるビューコントローラ以外のコントローラで呼ばれるようだ。そもそも画面遷移のときにはオブジェクトを解放してあげるのはマナーであるが、viewDidUnloadにもコードし、解放してあげることも必要となるようだ。
2010年5月3日月曜日
viewDidUnloadメソッドとdeallocメソッド
ビューのコントローラを構成する際のメモリ管理として、viewDidUnloadメソッドとdeallocメソッドでアウトレットでretainしたインスタンスの解放に関する実装が不可欠です。
deallocの場合、releaseですが、viewDidUnloadの場合、nilを設定するそうです。
------------- sample code ------------------
- (void)viewDidUnload {
deallocの場合、releaseですが、viewDidUnloadの場合、nilを設定するそうです。
------------- sample code ------------------
@synthesize nameField;
@synthesize numberField;
@synthesize sliderLabel;
@synthesize leftSwitch;
@synthesize rightSwitch;
@synthesize doSomethingButton;
- (void)viewDidUnload {
self.nameField = nil;
self.numberField = nil;
self.sliderLabel = nil;
self.leftSwitch = nil;
self.rightSwitch = nil;
self.doSomethingButton = nil;
[super viewDidUnload];
}
- (void)dealloc {
[nameField release];
[numberField release];
[sliderLabel release];
[leftSwitch release];
[rightSwitch release];
[doSomethingButton release];
[super dealloc];
}
------------------------------
2010年4月30日金曜日
アウトレットをリリースする。
アウトレット生成時に、アウトレットを保持するようコードを書くことになりましたが、
@property (nonatomic, retain) IBOutlet Objecttype *Object;
そのため、実行後のdealloc時に、当該オブジェクトを解放する必要があるようです。
-(void) dealloc {
[Object release];
[super dealloc];
}
@property (nonatomic, retain) IBOutlet Objecttype *Object;
そのため、実行後のdealloc時に、当該オブジェクトを解放する必要があるようです。
-(void) dealloc {
[Object release];
[super dealloc];
}
2010年4月29日木曜日
Objective-Cにおけるオブジェクトの生成と解放(メモリ管理)
オブジェクト指向プログラムでは、生成するオブジェクトを解放しないでいると、メモリーリークを起こしてしまい、システムに影響を与えてしまうようです。
そのため、オブジェクトの生成と解放(メモリ管理)をプログラム側でしっかりとしてあげないといけないようです。
◆オブジェクトの生成(alloc メソッド)と初期化(init メソッド)
一般には、以下のコードで生成し、初期化します。
id obj = [ [objectType alloc ] init ];
オブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。
◆オブジェクトの保持(retain メソッド)
オブジェクトを参照する場合、 他からの解放の危険を避けるため、明示的に保持(retain)を示すそうです。
◆オブジェクトの解放(releaseメソッド)
オブジェクトの登録が解除され、使用できなくなります。
これらの状態は、retainCountとよばれる保持数として管理されており、オブジェクトが無くなると「0」になります。
- (void)method
{
id obj = [[ObjectType alloc] init];//保持数 1
[obj retain]; //保持数 2
[obj release]; //保持数 1
[obj release]; //保持数 0 ... 解放されており、これ以降objは使用できない。
}
さらに、リリースを容易とするため、autoreleaseメソッドも準備されており、そのオブジェクトをautoreleaseすることで、プログラムの終了時に一度に解放してくれる仕組みがあるそうです。
また、途中でNSAutoreleasepoolオブジェクトを生成し、そのオブジェクトreleaseすると、プログラム終了をまたずとも、その間autoreleaseしたオブジェクトを解放してくれるそうです。
◆オブジェクトの廃棄(deallocメソッド) <アプリから呼び出してはならない>
保持数が0となったオブジェクトは、deallocメソッドが暗黙的に呼ばれて解放されるようです。オブジェクト固有のインスタンス変数がある場合はは、deallocメソッドをオーバライドし、固有インスタンスの解放を含め実装するようです。
くわしくは、こちらか、Appleの「Cocoaメモリ管理プログラムガイド」を参照ください。
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article01.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article02.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article03.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article04.html
そのため、オブジェクトの生成と解放(メモリ管理)をプログラム側でしっかりとしてあげないといけないようです。
◆オブジェクトの生成(alloc メソッド)と初期化(init メソッド)
一般には、以下のコードで生成し、初期化します。
id obj = [ [objectType alloc ] init ];
オブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。
◆オブジェクトの保持(retain メソッド)
オブジェクトを参照する場合、 他からの解放の危険を避けるため、明示的に保持(retain)を示すそうです。
この場合もオブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。
◆オブジェクトの解放(releaseメソッド)
オブジェクトの登録が解除され、使用できなくなります。
これらの状態は、retainCountとよばれる保持数として管理されており、オブジェクトが無くなると「0」になります。
- (void)method
{
id obj = [[ObjectType alloc] init];//保持数 1
[obj retain]; //保持数 2
[obj release]; //保持数 1
[obj release]; //保持数 0 ... 解放されており、これ以降objは使用できない。
}
さらに、リリースを容易とするため、autoreleaseメソッドも準備されており、そのオブジェクトをautoreleaseすることで、プログラムの終了時に一度に解放してくれる仕組みがあるそうです。
また、途中でNSAutoreleasepoolオブジェクトを生成し、そのオブジェクトreleaseすると、プログラム終了をまたずとも、その間autoreleaseしたオブジェクトを解放してくれるそうです。
◆オブジェクトの廃棄(deallocメソッド) <アプリから呼び出してはならない>
保持数が0となったオブジェクトは、deallocメソッドが暗黙的に呼ばれて解放されるようです。オブジェクト固有のインスタンス変数がある場合はは、deallocメソッドをオーバライドし、固有インスタンスの解放を含め実装するようです。
- (void)dealloc
{
[koyu_instans_var release]; // 固有インスタンス変数を解除
[super dealloc]; // 親クラスのdeallocを実行
}
くわしくは、こちらか、Appleの「Cocoaメモリ管理プログラムガイド」を参照ください。
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article01.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article02.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article03.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article04.html
登録:
投稿 (Atom)