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.