とりあえず →詳解 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ってあるの知らなかった!ちょう親切!!