NSDocument Подкласс не закрыт NSWindowController? - PullRequest
1 голос
/ 25 апреля 2010

Хорошо, я довольно новичок в Какао и Objective-C, а также в ООП в целом.

В качестве фона я работаю над расширяемым редактором, который хранит документы пользователя в пакете. Это, конечно, потребовало некоторого «веселья», чтобы обойти некоторые проблемы с NSFileWrapper (то есть несколько хитрый процесс написания и загрузки, чтобы избежать создания NSFileWrappers для каждого отдельного документа в комплекте). Решение, к которому я пришел, состояло в том, чтобы по существу трактовать мой подкласс NSDocument как просто оболочку - использовать его для создания папки для пакета, а затем выдавать за запись фактического содержимого документа другим методам.

К сожалению, в какой-то момент я, кажется, полностью облажался. Я не знаю, как это произошло, но закрытие окна документа больше не освобождает документ. Кажется, что объект документа не получает сообщение «закрыть» - или любые другие связанные сообщения - даже если окно успешно закрывается.

Конечным результатом является то, что если я запусту свое приложение, создам новый документ, сохраню его, затем закрою и попытаюсь открыть его снова, окно документа никогда не появится. С помощью некоторого творческого подкласса и NSLogging мне удалось выяснить, что объект документа все еще находится в памяти и все еще привязан к экземпляру NSDocumentController, и поэтому попытка открыть документ так и не достигла уровня NSDocumentController's "хмм, в настоящее время есть один открытый "чек.

У меня были экземпляры NSWindowController и NSDocumentController, но я полностью удалил их из своего проекта. Я переопределил почти каждый метод для NSDocument, пытаясь выяснить, где проблема. Насколько я знаю, все мои привязки Interface Builder верны - «Закрыть» в главном меню присоединено к performClose: первого ответчика и т. Д., И я также пробовал использовать свежие необработанные xib-файлы MainMenu и Document.

Я подумал, что это может быть что-то странное с моим кодом написания пакета, поэтому я в основном удалил все и начал с нуля, но, похоже, это не сработало. Я удалил свои переопределения -init, и это тоже не помогло. У меня нет источника каких-либо простых приложений для документов, поэтому я не попробовал следующий логический шаг (заменить мой известный работающий код методами readFromUrl и writeToUrl).

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

1 Ответ

1 голос
/ 25 апреля 2010

Трудно сказать без кода, но я бы посоветовал отправить:

closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:

... контроллеру документов, а затем, глядя на контроллер, передается делегату, чтобы увидеть, как меняется его состояние.

Если контроллер закрывает документ, когда вы отправляете явное сообщение, тогда ваша проблема с привязкой к окну.

...