iOS8上的SpriteKit中EXC_BAD_ACESS崩溃

时间:2016-05-09 19:49:33

标签: ios swift sprite-kit exc-bad-access

在尝试更改SKSpriteNode的位置时,我遇到了一个非常奇怪的崩溃。这种崩溃发生在iOS8而不是iOS9中。

// if the powerup is full, spawn the icon on screen
if orangeBallsCollected == numberOfBallsRequiredToActivatePowerup {

    // add the powerup icon to the array of powerupiconsonscreen
    powerupIconsOnScreen.append(fewerColorsPowerupIcon)

    // set the lighting mask of the powerup icon so that we know what positon it is onscreen for alter
    fewerColorsPowerupIcon.lightingBitMask = UInt32(powerupIconsOnScreen.count - 1)

    // remove the ball from its current parent
    fewerColorsPowerupIcon.removeFromParent()

    print(fewerColorsPowerupIcon, fewerColorsPowerupIcon.parent, fewerColorsPowerupIcon.physicsBody, fewerColorsPowerupIcon.superclass)

    // place the ball of the screen so that we can bring it on later
    fewerColorsPowerupIcon.position = CGPointMake((width * -0.1) , (height * -0.1))

    // set the size of the icon
    fewerColorsPowerupIcon.xScale = scaleFactor
    fewerColorsPowerupIcon.yScale = scaleFactor

    // add it the scene
    self.addChild(fewerColorsPowerupIcon)

    // animate it moving down to the first avaliable position
    let animation = SKAction.moveTo(CGPoint(x: width * 0.1, y: height * 0.1), duration: 0.5)

    // run the animation!
    fewerColorsPowerupIcon.runAction(animation)

    // activate the poweurp
    activateFewerColors()

}

当我尝试设置位置(fewerColorsPowerupIcon.position)时发生崩溃,这是崩溃消息:

  

主题1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

如果在设置节点位置后放置.removeFromParent()代码,则仍会发生此崩溃。

2 个答案:

答案 0 :(得分:1)

我认为如果你删除了精灵,你就无法做出。

所以试着这样做:

SELECT total_personnel  
FROM fact_personnel_on_site_category  
order by day_date desc  
limit 1;  

或者您可以先添加场景和更改后的属性:

let spriteCopy =  fewerColorsPowerupIcon.copy()

// place the ball of the screen so that we can bring it on later
spriteCopy.position = CGPointMake((width * -0.1) , (height * -0.1))

// set the size of the icon
spriteCopy.xScale = scaleFactor
spriteCopy.yScale = scaleFactor

// add it the scene
self.addChild(spriteCopy)

答案 1 :(得分:0)

如果fewerColorsPowerupIcon被声明为:

 weak var fewerColorsPowerupIcon: Type!

然后,只要您致电removeFromParent(),就不会再有强烈的引用了。如果是这样,则无法保证fewerColorsPowerupIcon将设置为nil或将被检测到。下次使用时,您可能会获得EXC_BAD_ACCESS。

找到这样的东西的一种方法是使用僵尸乐器。在它下面,没有任何对象在没有引用时真正被释放,但是如果你在释放所有强引用后尝试使用它们,它们会抱怨。

另一种选择是改变!至 ? (并更新使用var的代码)。这可能是一种痛苦,但有更多的保证如何?作用