0

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

我还需要保留一个打开的窗口列表,所以每当我打开一个窗口时,我都会将它的实例存储在字典中,当窗口关闭时,我会向主窗口发送一个通知,该窗口会触发一个方法,然后从字典。

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

我的问题是我既没有释放也没有自动释放新创建的对象,因为从字典中删除窗口时应该这样做(对吗?)。如果我确实释放或自动释放该对象,在我将其存储在字典中之后,当我尝试从字典中删除该对象时会出现各种错误。

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

2)无论如何,如果字典正在存储对它的引用,为什么自动释放会破坏我的窗口?

[更新] 下面的代码

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
}
4

3 回答 3

1

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

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

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

2)无论如何,如果字典正在存储对它的引用,为什么自动释放会破坏我的窗口?

您是否将窗口保留在某个地方,以便您需要在保留与释放或自动释放之间取得平衡?

如果没有,您将过度释放窗口。

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

无论如何,如果您没有+alloc打开窗口并且您没有-retain打开窗口,那么您不应该释放它。

于 2010-01-07T20:34:12.127 回答
0

确保关闭窗口的“关闭时释放”设置(或者您正在对其进行补偿)。如果它打开,它会在用户关闭它时自行释放。

于 2010-01-07T22:54:52.887 回答
0

确保listOpenWindows(其中确实应该有一个Of)不是nil. 也许您忘记创建它或尚未创建它。

于 2010-01-09T14:01:51.860 回答