【发布时间】:2011-01-08 21:58:31
【问题描述】:
我的自定义视图有一个子视图作为实例变量。 这是一个示例界面:
@interface MyCustomView : NSView {
NSView *aSubview;
}
@end
然后,在 .m 文件中,我初始化 aSubView 并将其添加到自定义视图中。
- (id)init
{
self = [super initWithFrame:CGRectMakeFrame(0.0, 0.0, 320.0, 480.0);
if (self) {
aSubview = [[NSView alloc] initWithFrame(0.0, 0.0, 100.0, 100.0);
[self addSubview:aSubview];
}
return self;
}
我应该在哪里释放aSubView?
在-dealloc 方法中?
- (void)dealloc
{
[aSubView release];
[super dealloc];
}
或者直接在-init方法中添加到自定义视图之后?
- (id)init
{
[...]
[self addSubview:aSubview];
[aSubview release];
[...]
}
哪一个是最好的实现?
【问题讨论】:
-
您创建它并将其添加为子视图,这意味着您拥有它两次。您的选择是立即释放创建所有权并在视图的剩余生命周期中仅拥有一次,或者在整个时间中保留实例变量中的子视图并在其末尾将其释放到
dealloc。只要两种所有权都通过发布来平衡,两种方式都同样有效。 -
不完全;如果你有一个实例变量作为参考,你应该保留一个直到 dealloc (如果那是你的预期寿命)。最不脆弱的方法是在任何给定的保留引用的生命周期内始终保留保留。当然,面对保留周期(有时这是魔鬼的工作),这会崩溃。所以...我建议在
dealloc中释放以平衡初始化方法中隐含的retain。 -
哦,
aSubview是一个非典型的 ivar 名称。subview或containedView会更有意义。aSubview作为方法的参数会更典型。 -
@bbum 不注意变量名,只是我放在那里为问题编写一些示例代码的占位符。显然,我实际处理的代码比这更复杂,并且对变量使用更合理的名称。
标签: objective-c cocoa memory-management