##オブジェクトの宣言
[クラス名] [オブジェクト名]
UIView* uiView;
UIView *uiView;
*の位置はどちらでもOK.
##オブジェクトのインスタンス化
allocメソッドでメモリ領域を確保、initで始まるメソッドで初期化する。
NSCalendar *calendar= nil;
calendar = [[NSCalendar alloc] initWithCalendarIdentifer];
##オブジェクトの解放
allocメソッドでメモリを確保したものは、明示的にreleaseする必要がある。
解放しないと、処理が実行される度にメモリを確保するのでメモリリークの原因になる。
[calendar release]
##オブジェクトのメモリ管理
オブジェクトのメモリ管理のために、「リファレンスカウンタ」がある。
###リファレンスカウンタとは
生成したオブジェクトが何カ所から参照されているかを管理している。
allocとinitで始まるメソッドで生成されたオブジェクトは、生成したメソッドを持つオブジェクトから参照されているので、リファレンスカウンタは1となる。
このオブジェクトを他のオブジェクトが利用する場合は、勝手に解放されてしまわないように、リファレンスカウンタを1加算する。(retain)
必要がなくなったら、カウンタを1減算する。(release)
リファレンスカウンタが0になったら、オブジェクトが解放される。
リファレンスカウンタを操作するメソッドは、NSObjectに定義されている。
retain リファレンスカウンタを++
release リファレンスカウンタを--
autorelease 現在の処理を抜けた時に自動的にrelease
retainCount リファレンスカウンタの値を取得
autoreleaseは、現在のメソッドを抜けた時に自動的にreleaseされる。
ただ、メソッドを抜けてからすぐにreleaseされる保証はない。
処理能力を重視する場合は、手動でreleaseすること。
不慣れなうちは、retainCountメソッドでリファレンスカウンタを確認すること。
unsigned int cnt = [OBJECTNAME retainCount];
メモリの管理基準
アプリの終了時には、deallocは呼ばれず、メモリリーク分も含めて一括でメモリが解放される。
ホームボタンを押してもすぐにアプリ終了とはならず、バックグラウンドに遷移するだけになる。
他のアプリの実行などでメモリが必要になった場合に、OSがバックグラウンドアプリを終了させることになる。
//allocを使う場合は、 autorelease
hoge = [[[Hoge alloc] init] autorelease];
//alloc以外の場合は、なにも指定しない
hoge =[Hoge hoge];
//インスタンス変数に残す場合は、retain
_hoge = [hoge retain];
//インスタンス変数を解放する場合はrelease
- (void)setHoge:hoge {
//カウンタが増えないように一回releaseしてからretain.
[_hoge release];
[_hoge retain];
}
-(void)dealloc {
[_hoge release];
[super dealloc];
}
//@"文字列"のオブジェクトは何もする必要はない。
hoge=@"hogehoge";
##オブジェクトのプロパティへのアクセス
//頭に-があれば、オブジェクトメソッドの定義
-(id)initWithCalendarIdentifier:(NSString*)calendarID
//頭が+の場合は、クラスメソッドの定義
+(id)stringWithFormat:(NSString*)format, ...
//プロパティへのアクセス
data = OBJECTNAME.PROPERTY;
##オブジェクトメソッドの呼び出し
[OBJECT_NAME METHOD];
//引数がある場合
[OBJECT_NAME METHOD:PARAM1]
//引数が二つある場合
[OBJECT_NAME METHOD:PARAM1 LABEL:PARAM2];
//NSStringの例
UIFont* font = [UIFont systemFOntOfSize:24];
[NSString drawAtPoint:CGPointMake(0, 0) withFont:font];
##デバッグについて
NSLog関数を利用する。
NSLog(書式文字列, 可変個引数);
//複数の引数を指定する場合
NSLog(@"%@は%d台", @"iPhone5", 100);