2017-03-22 77 views
0

我目前有一个崩溃,我找不到解决方案。SKLabelNode相关EXC_BAD_ACCESS崩溃

在我正在开发的应用程序中,我有一个自定义类LabelNode: SKNode,它使用SKLabelNodeSKSpriteNode在黑色方形背景上创建白色文本。此标签可以与带有setText(newText: String)功能新值每帧以下

class LabelNode: SKNode { 

private let textNode: SKLabelNode 
private let backgroundNode: SKSpriteNode 
private let padding: CGFloat 

var width: CGFloat = 0 
var height: CGFloat = 0 
var horizontalAlignment = SKLabelHorizontalAlignmentMode.center 

init(fontSize: CGFloat, text: String? = "A") { 
    textNode = SKLabelNode(fontNamed: "Arial") 
    textNode.zPosition = 1 
    backgroundNode = SKSpriteNode(color: UIColor.black, size: CGSize(width: 0, height: 0)) 
    textNode.fontColor = UIColor.white 
    textNode.fontSize = fontSize 
    textNode.text = text 
    textNode.verticalAlignmentMode = SKLabelVerticalAlignmentMode.top 
    height = textNode.frame.size.height 
    textNode.position.y = (height/2) 
    padding = 0.165 * height 
    width = textNode.frame.size.width 
    backgroundNode.size = CGSize(width: width + padding, height: height + padding) 
    backgroundNode.position.x = textNode.frame.midX 
    super.init() 
    addChild(textNode) 
    addChild(backgroundNode) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented for LabelNode") 
} 

func setText(newText: String) { 
    self.textNode.text = newText 
    width = self.textNode.frame.size.width 
    backgroundNode.size = CGSize(width: width + padding, height: height + padding) 
    backgroundNode.position.x = textNode.frame.midX 
} 

func setFontColor(newFontColor: UIColor) { 
    self.textNode.fontColor = newFontColor 
} 

func setAlignment(newAlignment: SKLabelHorizontalAlignmentMode) { 
    self.textNode.horizontalAlignmentMode = newAlignment 
} 

}更新

我的应用程序不断抛出EXC_BAD_ACCESS随机时间间隔,有时有不同的错误信息,并且在不同的线程。有时xcode指向该行

width = self.textNode.frame.size.width 

但有时在线程x上的随机行,但上面的行在线程y中处于活动状态。

如果僵尸被激活,但两者All Exceptions断点和malloc_error_break停用我得到崩溃以下端子输出

-[SKTexture dealloc]: message sent to deallocated instance 0x10bbaf70 

其中po 0x10bbaf70只给出了输出

280735600 

和以下堆栈跟踪

* thread #41: tid = 0x73287, 0x1d9ac4d0 CoreFoundation`___forwarding___ + 532, queue = 'com.apple.scenekit.renderingQueue.applicationName.GameView0x1478d2b0', stop reason = EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe) 
frame #0: 0x1d9ac4d0 CoreFoundation`___forwarding___ + 532 
frame #1: 0x1d8d13d8 CoreFoundation`_CF_forwarding_prep_0 + 24 
frame #2: 0x1cc25194 libobjc.A.dylib`objc_object::sidetable_release(bool) + 238 
frame #3: 0x2b23ff0a SpriteKit`SKCSpriteNode::~SKCSpriteNode() + 38 
frame #4: 0x2b23ff28 SpriteKit`SKCSpriteNode::~SKCSpriteNode() + 8 
frame #5: 0x2b2204a2 SpriteKit`SKCLabelNode::rebuildText() + 134 
frame #6: 0x2b2201b2 SpriteKit`SKCLabelNode::getBoundingBox() + 34 
frame #7: 0x2b27d248 SpriteKit`-[SKNode frame] + 40 
frame #8: 0x2b297928 SpriteKit`-[SKLabelNode frame] + 40 
* frame #9: 0x000aea54 applicationName`LabelNode.setText(newText="9 555 m", self=0x15863970) ->() + 288 at LabelNode.swift:45 

如果我All Exceptions断点和malloc_error_break激活我没有得到任何端子输出和以下堆栈跟踪运行

* thread #21: tid = 0x7414f, 0x1cc24612 libobjc.A.dylib`objc_release + 2, queue = 'com.apple.scenekit.renderingQueue.applicationName.GameView0x177651b0', stop reason = EXC_BAD_ACCESS (code=1, address=0x2) 
frame #0: 0x1cc24612 libobjc.A.dylib`objc_release + 2 
frame #1: 0x2b23fefa SpriteKit`SKCSpriteNode::~SKCSpriteNode() + 22 
frame #2: 0x2b23ff28 SpriteKit`SKCSpriteNode::~SKCSpriteNode() + 8 
frame #3: 0x2b2204a2 SpriteKit`SKCLabelNode::rebuildText() + 134 
frame #4: 0x2b2201b2 SpriteKit`SKCLabelNode::getBoundingBox() + 34 
frame #5: 0x2b27d248 SpriteKit`-[SKNode frame] + 40 
frame #6: 0x2b297928 SpriteKit`-[SKLabelNode frame] + 40 
* frame #7: 0x00181a54 applicationName`LabelNode.setText(newText="4 033 m", self=0x17786cb0) ->() + 288 at LabelNode.swift:45 

有谁知道这是什么崩溃背后的原因是或者任何进一步的步骤我可以采取的一些启发这个?任何提示将是非常有用的:)

回答

0

你还没有展示足够的代码来完全理解你的问题,从它看起来像你是什么子类的labelNode,并试图将spriteNode放在该标签后面?在我看来,这将是一个更简单的情况。

class LabelNode : SKSpriteNode { 

init(texture: SKTexture?, color: UIColor, size: CGSize, text: String) { 

    super.init(texture: texture, color: color, size: size) 


    let label = SKLabelNode(fontNamed: "Courier-Bold") 
    label.fontSize = 50 
    label.fontColor = SKColor.black 
    label.position = CGPoint.init(x: 0.0, y: 0.0) 
    label.zPosition = 1 
    label.verticalAlignmentMode = .center 
    label.text = text 
    self.addChild(label) 

} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

     } 

创建一个自定义精灵节点类和直接添加标签到它。

然后将其添加到视图中。

 let labelNode = LabelNode(texture: nil, color: .white, size: CGSize.init(width: 400, height: 100) , text: "Enter text") 
    labelNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY) 

    self.addChild(labelNode) 
相关问题