Objective-Cでのメモリ管理は「参照カウンタ」

Objective-Cでのメモリ管理は「参照カウンタ」

メソッド内でインスタンスを作って作って終わったら破棄するだけなら
シンプルだが、作成したインスタンスを他のオブジェクトからも利用される事がある。
一般的にはガーベッジコレクションを利用することで解決するが、
Objective-Cいんはその仕組みがないので変わりに「参照カウンタ」を用いて解決する。

参照カウンタとは…

作られたインスタンスは常にいくつのオブジェクトから参照されているかを保持しておく。
オブジェクトはインスタンスを使わなくなったタイミングでこの参照カウンタの数を−1する。
この参照カウンタを+したりーしたりするのがalloc release retailというメソッドになる。

alloc,init --参照カウンタを+1

allocでインスタンスを作成、initで初期化
(例)NSDataFormatterのインスタンス生成

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
release --参照カウンタを−1

NSDateFormatterのサンプルコード

-(void)updateTime:(NStimer*)timer{
  NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  NSDate *now = [NSDate date];
  [formatter setDateFormat:@"HH:mm:ss"];
  //処理をいろいろやる
  [formatter release];
}
dealloc

インスタンスの参照カウンタが0になりインスタンスが解放されるときに呼び出される。
(例)保持していたアウトレットを解放して最後にスーパークラスのdeallocを呼ぶ。
スーパークラスで保持していたインスタンスを解放する

-(void)dealloc{
	[_webView release];
	[_backButton release];
	[_reloadButton release];
	[super dealloc];
}
autorelease

これを用いるとインスタンスはAutoreleasePoolという場所に送られる。
これは自動的に解放されるが、自前でAutorreleasePoolを書くこともできる。
複数のインスタンスを一度に解放するのに便利。
(例)通常のautoreleasePoolを利用する場合

-(void)updateTime:(NStimer*)timer{
	NSDateFormatter *formatter = [[[NSDateFormatter alloc]init]autorelease];
	//不要[formatter release];
}

(例)自前でautoreleasePoolを用意する場合

-(void)updateTIme:(NStimer*)timer{
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    NSDateFormatter *formatter = [[[NSDateFormatter alloc]init]autorelease];
	[pool release];
}

retain

明示的にインスタンスが解放されないように参照カウンタを+1する

[text retain];

簡易コンストラク

NSString *text =  [[NSString alloc] initWithFormat:@"count:%d",count];
//⬇autoreleasePoolを使用する
NSString *text = [[[NSString alloc] initWIthFormat:@"count:%d",count] autorelease];
//⬇同じことを簡易コンストラクタで行う
NSString *text = [NSString stringWithFormat:@"count:%d",count];