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アプリで稼げるのか
参考になった。