2017-01-20 3 views
1

В моей программе, я в настоящее время определить SKSpriteNode как weak в начале моего кода (в моем GameScene классе) и объявить его как это:Swift 3 (SpriteKit): Стоп слабый SKSpriteNode стать ноль после инициализации

weak var tapFade: SKSpriteNode? = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10)) 

Однако, так как это weak и не имеет текущих ссылок, он удаляется и становится nil, прежде чем я требую его использования. Кроме того, в моей программе, я инициализацию weak SKLabelNode так:

weak var tapToBegin: SKLabelNode? = SKLabelNode(text: "Tap to Begin") 

и он не удаляется сразу, в отличие от SKSpriteNode. То, как я достиг этого был перезагрузкой объявляя SKLabelNode, прежде чем я использовать его как это:

tapToBegin = SKLabelNode(text: "Tap to Begin") 

Это сделало SKLabelNode не nil, когда я хотел использовать его. Хотя, я попытался повторно объявить SKSpriteNode с этим же подходом, и он все еще был nil.

Примечание: Это где инициализацый и где мне нужно сначала использовать эти nodes в моей программе:

class GameScene: SKScene, SKPhysicsContactDelegate { 

    //Initialisations are here 
    weak var tapFade: SKSpriteNode? = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10)) 
    weak var tapToBegin: SKLabelNode? = SKLabelNode(text: "Tap to Begin") 

    override func didMove(to view: SKView) { 
     //I first use these nodes here 
    } 
} 

Есть ли способ, чтобы предотвратить SKSpriteNode от немедленно быть де- инициализируется? Кроме того, почему SKSpriteNode немедленно удаляется, а SKLabelNode нет?

+0

То, что вы указали, не имеет смысла. Также я попробовал ваш код и оба этикета, и спрайт немедленно освобождается. Поскольку ничто не удерживает эти узлы, они освобождаются, как только заканчивается 'didMove (toView:)'. В вашем коде есть что-то, что сохраняет эту метку. – Whirlwind

+0

Прочтите мой комментарий на ответ @ Muffinman2497. –

ответ

2

Использование ключевого слова weak приведет к тому, что SpriteNode будет выбран ARC и будет удален. Поэтому, когда вы пытаетесь взаимодействовать с SpriteNode, вы получите исключение, потому что оно больше не находится в памяти. Уберите weak перед ключевым словом var.

var tapFade:SKSpriteNode = SKSpriteNode(color: UIColor.red, size: CGSize(width: 10, height: 10)) 
+0

Но мне нужно, чтобы SpriteNode был слабым, чтобы его можно было удалить позже. –

+0

Зачем его нужно удалить позже? Это вызывает проблемы с памятью? Не могли бы вы дать мне больше информации о том, что вы пытаетесь сделать. – Muffinman2497

+0

Да, это позже в программе. –

Смежные вопросы