Замены устаревших методов NSNibLoading (loadNibFile :, loadNibNamed: и т.д.)?
Я обнаружил, что методы NSNibLoading в NSBundle:
+[NSBundle loadNibFile:externalNameTable:withZone:]
+[NSBundle loadNibNamed:owner:]
-[NSBundle loadNibFile:externalNameTable:withZone:]
все были отмечены как устаревшие в 10.8 - каков правильный способ загрузки ножей в 10.8 и более поздних версиях?
Я пытаюсь создать пользовательский листок в своем приложении, мне нужно создать NSWindowController
с initWithWindowNibName
для пользовательского листа?
Ответы
Ответ 1
Метод класса NSBundle
loadNibNamed:owner:
устарел в OS X v10.8,
loadNibNamed:owner:topLevelObjects:
не, а комментарии в документации определяют, почему:
В отличие от устаревших методов, объекты придерживаются стандартных правил управления памятью cocoa; необходимо сохранить для них сильную ссылку на них, используя IBOutlets или удерживая ссылку на массив, чтобы предотвратить освобождение содержимого nib.
Ответ 2
Если ваше приложение будет поддерживать Lion, тогда loadNibNamed:owner:topLevelObjects:
не будет срабатывать, и при запуске на Lion вы получите исключение (непризнанный селектор). После некоторого поиска я придумал следующее:
// loadNibNamed:owner:topLevelObjects was introduced in 10.8 (Mountain Lion).
// In order to support Lion and Mountain Lion +, we need to see which OS we're
// on. We do this by testing to see if [NSBundle mainBundle] responds to
// loadNibNamed:owner:topLevelObjects: ... If so, the app is running on at least
// Mountain Lion... If not, then the app is running on Lion so we fall back to the
// the older loadNibNamed:owner: method. If your app does not support Lion, then
// you can go with strictly the newer one and not deal with the if/else conditional.
if ([[NSBundle mainBundle] respondsToSelector:@selector(loadNibNamed:owner:topLevelObjects:)]) {
// We're running on Mountain Lion or higher
[[NSBundle mainBundle] loadNibNamed:@"NibName"
owner:self
topLevelObjects:nil];
} else {
// We're running on Lion
[NSBundle loadNibNamed:@"NibName"
owner:self];
}
Если вы действительно хотите использовать topLevelObjects:&array
для Mountain Lion +, и вы также хотите поддержать Lion, похоже, вам нужно будет вернуться на loadNibFile: externalNameTable: withZone: (доступен как метод класса и экземпляра ) для условия Льва (я мог ошибаться в этом). У меня создается впечатление, что loadNibNamed:owner:topLevelObjects:
был создан для замены этого.
В другом месте я также читал, что при использовании более нового loadNibNamed:owner:topLevelObjects:
для листа вам следует снять флажок "Release When Closed" для листа (окна). Это нужно позаботиться, когда вы закрываете лист:
[self.sheet close];
self.sheet = nil;
Я не уверен, что нужно делать с этим флажком, если вы открываете немодальное окно. Любые идеи?