gpt4 book ai didi

objective-c - 使用字典进行内存管理/GCC 可能会产生误解?

转载 作者:行者123 更新时间:2023-12-03 18:06:12 26 4
gpt4 key购买 nike

在我的代码中的某个地方,我需要从主窗口创建多个窗口,每个窗口都具有特定的配置,但所有实例都是同一 Controller 对象。

我还需要保留打开的窗口列表,因此每当我打开一个窗口时,我都会将其实例存储在字典中,当窗口关闭时,我会向主窗口发送一条通知,该通知会触发一个方法,然后删除该特定的方法字典窗口。

我通过创建 Controller 对象的实例然后在其上调用 [showWindow:self] 来创建窗口。然后,我将窗口存储在字典中并退出该方法。

我的问题是,我既不释放也不自动释放新创建的对象,因为这应该在从字典中删除窗口时完成(对吗?)。如果我释放或自动释放该对象,则在将其存储在字典中后,当我尝试从字典中删除该对象时,我会收到各种错误。

1) 这可能是 Xcode 中的一个简单错误,没有注意到实例存储在字典中吗?

2)无论如何,如果字典存储了对它的引用,为什么 autorelease 会破坏我的窗口?

[更新]代码如下

CHPostgreSQLMainController *pgMainController = [[CHPostgreSQLMainController alloc]initWithConnectionSettings:(CHPostgreSQLSettingsModel *)entityFromArray error:&error];

// Only display the window if the connection was successful.
if (pgMainController) {
[pgMainController showWindow:self];

// Register the window we've opened on the list of open windows
[listOpenWindows setObject:pgMainController forKey:[entityFromArray connectionName]];
} else {
//call NSAlert
}

最佳答案

1) Could this be a simple bug in Xcode that doesn't notice the instance being stored in the dictionary?

没有。保留、释放和自动释放的发生是因为您编写了使它们发生的代码。 Xcode 不会在您的代码中插入任何此类行为。

现在,它肯定可能是静态分析器中的一个错误(正如您所指出的)。请发布更多代码。

2) Anyway, why does autorelease destroy my window, if the dictionary is storing a reference to it?

您是否将窗口保留在某处,以便需要平衡保留与释放或自动释放?

如果没有,则说明您过度释放了窗口。

尝试运行静态分析器(构建和分析)并修复它发现的任何问题。

无论如何,如果你没有 +alloc window ,而你没有-retain窗口,你不应该释放它。

关于objective-c - 使用字典进行内存管理/GCC 可能会产生误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2023325/

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