SpriteBuilder Swift код соединения ноль ссылки и проблемы освобождения

Я использую Swift (XCode 7.2.1) и SpriteBuilder (1.4.9) для создания игры. Однако у меня возникли некоторые проблемы с созданием соединений кода между файлами CCB и классами Swift. Я следовал инструкциям в Интернете и добавил имя соединения с корневым кодом документа в SpriteBuilder, а затем установил соответствующее свойство в классе как private weak var m_myVar: MyClass!, Однако всякий раз, когда я пытаюсь получить доступ к собственности, я получаю nil ссылка. Если я удалю weak атрибут из соединения кода, тогда я могу получить доступ к свойству, но я получаю проблемы освобождения, когда сцена разрушена, например, переход к новой сцене с использованием CCDirector.shareDirector().replaceScene() метод.

В моем конкретном случае у меня есть MainScene в SpriteBuilder со следующей иерархией узлов: CCNode -> CCNodeGradient -> Tile, куда Tile подкласс CCNode определяется в другом файле CCB и имеет doc root var код подключения имени m_levelLabel, который отображается на private weak var m_levelLabel: Tile! собственность MainScene учебный класс.

Tile класс имеет 2 свойства m_background типа CCSprite9Slice а также m_label типа CCLabelTTFоба из которых сопоставлены с private weak var свойства в Tile Свифт класс.

Когда MainScene загружает я пытаюсь установить некоторые свойства на m_levelLabel используя следующий код:

internal func didLoadFromCCB() {
    m_levelLabel.setValue("2");
}

а также Tile.setValue определяется в Tile Класс как:

internal func setValue(value: String) {
    m_label.string = value;
}

Но когда setValue метод выполняет m_label свойство nil и так fatal error: unexpectedly found nil while unwrapping an Optional value происходит. Это странно, как ясно мои соединения кода в MainScene класс работал нормально, как я мог позвонить m_levelLabel.setValue,

Интересно, если я изменю свойства в Tile Класс должен быть определен как сильные ссылки, такие как:

private var m_label: CCLabelTTF!;

Затем код выполняется нормально, и значение метки обновляется, когда MainScene грузы. Однако приложение теперь вылетает, когда я пытаюсь уйти от MainScene с ошибкой malloc: *** error for object 0x7a9f3200: pointer being freed was not allocated звучит так, как будто есть проблема при разрушении сильных свойств в Tile класс принадлежит MainScene,

Что здесь может происходить? Как правильно определить кодовые соединения в Swift? Примечание. Я не получаю предупреждений в консоли о пропущенных свойствах соединения с кодом.

Для справки вот MainScene а также Tile класс во всей их полноте:

Main.swift

import Foundation

internal class MainScene: CCScene {

    internal func didLoadFromCCB() {
        m_levelLabel.setValue("1");
        m_progressLabel.setValue("0%");
    }

    internal func play() {
        let gameplayScene: CCScene = CCBReader.loadAsScene("Gameplay/GameplayScene");
        CCDirector.sharedDirector().replaceScene(gameplayScene);
    }

    internal func levelSelection() {
        print("Pressed level selection");
    }

    internal func progress() {
        print("Pressed progress button");
    }

    private weak var m_playButton: CCButton!;
    private weak var m_levelSelectionButton: CCButton!;
    private weak var m_progressButton: CCButton!;
    private weak var m_levelLabel: Tile!;
    private weak var m_progressLabel: Tile!;
}

Tile.swift

import Foundation

internal class Tile : CCNode {

    internal var value: String? {
        return m_label?.string;
    }

    internal func setValue(value: String) {
        m_label.string = value;
    }

    private weak var m_label: CCLabelTTF!;
    private weak var m_background: CCSprite9Slice!;
}

1 ответ

Решение

Получается, что для того, чтобы соединения кода всегда работали, они должны иметь internal доступность, а не private, Например

internal weak var m_label: CCLabelTTF!;

скорее, чем

private weak var m_label: CCLabelTTF!;

Я не уверен почему private работает в некоторых случаях, но не в других, и это позор, что я не могу должным образом инкапсулировать эти данные. Я полагаю, это связано либо с ошибкой в ​​библиотеке SpriteBuilder, либо с ограничением из-за языка Swift.

Другие вопросы по тегам