Управление памятью с помощью словарей / возможная неправильная интерпретация со стороны GCC? - PullRequest
0 голосов
/ 07 января 2010

Где-то в моем коде мне нужно создать несколько окон из главного окна, каждое из которых функционирует с определенной конфигурацией, но со всеми экземплярами одного и того же объекта контроллера.

Мне также нужно сохранить список открытых окон, поэтому всякий раз, когда я открываю окно, я сохраняю его экземпляр в словаре, а когда окно закрывается, я отправляю уведомление в главное окно, которое вызывает метод, который затем удаляет этот конкретный окно из словаря.

Я создаю окна, создавая экземпляр их объекта контроллера и затем вызывая [showWindow: self] для него. Затем я сохраняю окно в словаре и выхожу из метода.

Моя проблема в том, что я не освобождаю и не автоматически освобождаю вновь созданный объект, как это должно быть сделано при удалении окна из словаря (правильно?). Если я освобождаю или автоматически высвобождаю этот объект, после того, как я сохраню его в словаре, при попытке удалить объект из словаря я получу все виды ошибок.

1) Может ли это быть простой ошибкой в ​​Xcode, которая не замечает, что экземпляр хранится в словаре?

2) В любом случае, почему авто-релиз уничтожает мое окно, если в словаре хранится ссылка на него?

[Update] Код ниже

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
}

Ответы [ 3 ]

1 голос
/ 07 января 2010

1) Может ли это быть простой ошибкой в ​​Xcode это не замечает того случая хранится в словаре?

Нет. Сохранения, выпуски и автоматические выпуски происходят потому, что вы написали код для их реализации. Xcode не вставляет такое поведение в ваш код.

Теперь это может быть ошибка в статическом анализаторе (как вы указали). Пожалуйста, оставьте больше кода.

2) В любом случае, почему происходит авто-релиз? уничтожь мое окно, если в словаре хранит ссылку на него?

Вы сохранили окно где-нибудь так, что вам нужно сбалансировать удержание с выпуском или автоматическим выпуском?

Если нет, вы переусердствуете с окном.

Попробуйте запустить статический анализатор (построить и проанализировать) и исправить все обнаруженные проблемы.

В любом случае, если вы не открыли окно +alloc и не открыли окно -retain, вы не должны его отпускать.

0 голосов
/ 09 января 2010

Убедитесь, что listOpenWindows (в котором действительно должно быть Of) не равно nil. Возможно, вы забыли создать его или еще не создали.

0 голосов
/ 08 января 2010

Убедитесь, что параметр «разблокировать при закрытии» окна отключен (или что вы его компенсируете). Если он включен, он отключается, когда пользователь закрывает его.

...