ページ

2009年12月6日日曜日

今週のCocoa情報(12/6) - 今週気になった Cocoaプログラミング情報の紹介

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Memory Management of Interface Builder Outlets - Stack Overflow

プロパティを IBOulet として使っている場合のメモリ管理についての話題。

ちょっと試してみた。非プロパティの object_normal、プロパティの object_assign、プロパティの object_retain の3種類の IBOutlet を用意する。


@interface MemoryStudyAppDelegate : NSObject {
    NSWindow *window;

IBOutlet NSObject* object_normal;
NSObject* object_assign;
NSObject* object_retain;
}

@property (assign) IBOutlet NSWindow *window;

@property (assign) IBOutlet NSObject *object_assign;
@property (retain) IBOutlet NSObject *object_retain;

@end


InterfaceBuilder で NSObjectを3つ用意してそれぞれ接続しておく。

その上で retainCount を見てみる。


@implementation MemoryStudyAppDelegate

@synthesize window;
@synthesize object_assign, object_retain;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application

NSLog(@"[1] object_normal: %d", [object_normal retainCount]);
NSLog(@"[1] object_assign: %d", [object_assign retainCount]);
NSLog(@"[1] object_retain: %d", [object_retain retainCount]);

}

@end


結果。

MemoryStudy[3798:80f] [1] object_normal: 1
MemoryStudy[3798:80f] [1] object_assign: 1
MemoryStudy[3798:80f] [1] object_retain: 2


プロパティ object_retain は nibでの retainに加え、プロパティ設定時のretainがあるのでカウントが2となる。assign はメモリ管理については非プロパティと同じになる。

IBOutlet を使う場合は既に retain されているので正確にメモリ管理するのであれば assign が良い。(ただBOutlet 指定するオブジェクトは大体の場合アプリの起動中は変更しないので通常はそこまで気にする必要はなさそうだが。

(参考)【コラム】ダイナミックObjective-C (104) プロパティ(4) - プロパティの属性 | エンタープライズ | マイコミジャーナル



【Xcode】設定しておくと便利なカスタマイズいろいろ | iphoneアプリで稼げるのか

参考になった。