Замены устаревших методов NSNibLoading (loadNibFile :, loadNibNamed: и т.д.)? - программирование
Подтвердить что ты не робот

Замены устаревших методов NSNibLoading (loadNibFile :, loadNibNamed: и т.д.)?

Я обнаружил, что методы NSNibLoading в NSBundle:

+[NSBundle loadNibFile:externalNameTable:withZone:]
+[NSBundle loadNibNamed:owner:]
-[NSBundle loadNibFile:externalNameTable:withZone:]

все были отмечены как устаревшие в 10.8 - каков правильный способ загрузки ножей в 10.8 и более поздних версиях?

Я пытаюсь создать пользовательский листок в своем приложении, мне нужно создать NSWindowController с initWithWindowNibName для пользовательского листа?

4b9b3361

Ответ 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;

Я не уверен, что нужно делать с этим флажком, если вы открываете немодальное окно. Любые идеи?