2010.6

ObjCのメモリ管理のメモ

2010/06/29

とりあえず →詳解 Objective-C 2.0 のメモリの項をよんでたくさんハテナが浮かんだので、もっとやさしいところから・・・というわけで、なんとなくざっくり把握したところのメモ。


前提ルール

  • alloc と retain、copyしたときに参照カウントが増える。参照の所有者(生成モトでオーナーシップをもっているもの)がreleaseしゼロの時deallocが呼ばれメモリが解放される
  • クラスメソッドで生成されたものは自前でreleaseしなくていい
  • iphoneの@propaty宣言はだいたい(nonatomic,retain) 。ただしself.つけないとアクセサ扱いにならない。assignはガベコレを意図したものだがiphoneはガベコレない。
  • ループ内などではautoreleaseを活用

凡例

/*
インタフェース
*/
@interface HogeViewControler:UIViewController
{
	UILabel * windowLabel;
	NSArray * myHogeArray;
}
@property( nonatomin, retain) IBOutlet UILabel * windowLabel;
@property( nonatomin, retain) NSArray * myHogeArray;

@end


/*
実装
*/
#import "HogeViewControler.h"

@implementation HogeViewControler
@synthesize windowLabel, myHogeArray;

-(void) viewDidLoad
{
	//[1] allocでarrayが保持しているのでリリースする必要がある
	NSArray * array = [[NSArray alloc] initWithObjects : @"1", @"2", nil];

	//[2] arrayを参照しているのでretainCountふえる
	//setterのretainとarrayから渡されたポインタで合計2
	//self. なしだとアクセサにならずただの代入 
	//retainで確保されているのでNSArray * array側がreleaseしても存続できる

	self.myHogeArray = array;
	NSLog(@"%d" , [myHogeArray retainCount]); // 出力:2 


	//[3] クラスメソッドはautoreleaseされる
	NSArray * myFugaArray = [NSArray arrayWithObjects:@"1", @"2", nil]; 

	//[4] autorelease Pool
	int i = 0;
 	for ( i = 0; i < 10; i++)
 	{
 	 	NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init];
 	 	//大量生成されるオブジェクトを記述あとでリリース 	 	
 	 	[pool release];
 	}

	//[1] arrayのリリース
	[array release];
}

-(void) viewDidUnLoad
{
	//[2] setterのretainが確保しているカウントを解放
	//これってNSObject継承したクラスだとどこでよぶの?
	self.myFugaArray = nil;
	self.windowLabel = nil;
}

-(void) dealloc
{
	//[2] インスタンスプロパティの最終的な解放
	[windowLabel release];
	[myHogeArray release];
	[super dealloc];
}
@end

参考にしたサイト

→はじめてのiPhone3プログラミング [amazon]
→メモリ管理 byこたつつきみかん
→Objective-C メモリ管理 : 生成と解放 by Natsu's note
→iPhoneアプリ開発:XcodeのBuild and Analyze by Natsu's note
→Objective-Cのメモリ管理 by Nosue's log
→Cocoaでいこう! Macらしく 第13回

Build and Analyzeってあるの知らなかった!ちょう親切!!