gpt4 book ai didi

objective-c - NSView * 实例变量的 Obj-C 内存管理

转载 作者:行者123 更新时间:2023-12-03 16:55:44 27 4
gpt4 key购买 nike

我的自定义 View 有一个 subview 作为实例变量。这是一个示例界面:

@interface MyCustomView : NSView {
NSView *aSubview;
}

@end

然后,在 .m 文件中,我初始化 aSubView 并将其添加到自定义 View 中。

- (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 方法中将其添加到自定义 View 后?

- (id)init
{
[...]
[self addSubview:aSubview];
[aSubview release];
[...]
}

哪一个是最好的实现?

最佳答案

您的代码中有两个保留,用于不同的目的。最好将它们分开。

保留#1

第一个保留由 aSubview = [[NSView alloc] initWithFrame(0.0, 0.0, 100.0, 100.0); 隐含。由于 aSubview 是一个实例变量,并且您似乎希望在初始化程序运行后保留 aSubview 作为对 View 的有效引用,因此隐含的保留是有意义的通过 dealloc 中的 release 进行平衡。

保留#2

当添加到 View 层次结构时,您的 View 实例将由它的 subview 保留。在这种情况下,它是 self 是无关紧要的。只要 View 是 View 层次结构的一部分,retain 就会生效。当它被删除时,它将被释放。

<小时/>

两者是对象生命周期的正交实现。将它们分开可以使您的代码不那么脆弱。

例如,如果在未来的某个版本中,您偶尔会从 View 层次结构中删除 View ,并希望稍后将其粘回去 - 最终的显示/隐藏,如果您愿意的话 - 那么保留 #1 上面将保留它。

同样,如果您有一天想要忘记当前 View ,而是用其他 View 替换它,您可以简单地执行以下操作:

[aSubview release];
aSubview = [[.... alloc] ... init ... ];

并且,在这种情况下,上面的 retain #2 将使旧 View 在 View 层次结构中保持事件状态。

关于objective-c - NSView * 实例变量的 Obj-C 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4636377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com