NSNotificationCenter使用SpriteKit导致EXC_BAD_ACCESS错误

汤姆

我正在使用NSNotificationCenter试图控制SpriteKit中的计时器。首次输入SKScene时,代码运行良好,但是当我尝试重新输入SKScene时,出现EXC_BAD_ACCESS错误。我认为这与removeObserver函数有关。我不确定何时删除观察者,我尝试在prepareForSegue函数中执行此操作,但未成功。我的viewController如下:

class JobStartedViewController: UIViewController {



var titleOfJob: String = ""

override func viewDidLoad() {
    super.viewDidLoad()

    let skView = self.view as! SKView

  let scene:SKScene = GameScene.init(size: skView.bounds.size)

    NSNotificationCenter.defaultCenter().postNotificationName("stopTimerNotification", object: nil)
    NSNotificationCenter.defaultCenter().postNotificationName("startTimerNotification", object: nil)

    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = true

    /* Set the scale mode to scale to fit the window */
    scene.scaleMode = .AspectFill

    skView.presentScene(scene)
}

并将观察者添加到我的GameScene.swift中,如下所示:

class GameScene: SKScene {   


override func didMoveToView(view: SKView) {


    NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopTimerInBackground:", name:"stopTimerNotification", object: nil)
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "startTimerInBackground:", name:"startTimerNotification", object: nil)
布莱恩·尼克尔

以下是可能的事件流:

  1. 您呈现JobStartedViewController,它将创建场景并将其添加到视图中,从而触发didMoveToView(_:)并添加两个观察者。
  2. 您关闭视图控制器或从中删除场景SKView不久之后的某个时刻,不再有对该场景的强大引用,并且将其释放。此时,通知中心中仍存在对其的不安全引用。
  3. 您提出另一个JobStartedViewController或以其他方式发布stopTimerNotification通知。
  4. NSNotificationCenter 尝试在已取消分配的场景上执行选择器,导致应用崩溃。

使用的通常做法NSNotificationCenter是在deallocObjective-Cdeinit方法Swift方法中删除观察者

class GameScene: SKScene {

    // ...

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

如果您打算多次在视图中添加和删除该场景,则还应考虑从中删除观察者willMoveFromView(_:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift dispatch_async导致EXC_BAD_ACCESS错误

来自分类Dev

CGContextDrawLinearGradient导致EXC_BAD_ACCESS

来自分类Dev

NSTableView与源,导致EXC_BAD_ACCESS

来自分类Dev

Swift:animator()导致EXC_BAD_ACCESS

来自分类Dev

NSLocale NSLocaleCalendar导致EXC_BAD_ACCESS

来自分类Dev

委托分配导致EXC_BAD_ACCESS

来自分类Dev

didSet导致EXC_BAD_ACCESS

来自分类Dev

按下主屏幕按钮会在SpriteKit SKView中导致EXC_BAD_ACCESS代码= 1

来自分类Dev

按下主屏幕按钮会在SpriteKit SKView中导致EXC_BAD_ACCESS代码= 1

来自分类Dev

UIAlertController EXC_BAD_ACCESS错误-Swift

来自分类Dev

迅速细分错误(EXC_BAD_ACCESS)

来自分类Dev

MIDINetworkConnection EXC_BAD_ACCESS错误

来自分类Dev

fscanf中的Exc_bad_access错误

来自分类Dev

NSDictionary的EXC_BAD_ACCESS错误

来自分类Dev

CGImageRef出现EXC_BAD_ACCESS错误

来自分类Dev

EXC_BAD_ACCESS错误,无信息

来自分类Dev

CLLocationManager EXC_BAD_ACCESS错误

来自分类Dev

SpriteKit SKEmitterNode targetNode崩溃EXC_BAD_ACCESS

来自分类Dev

在Swift 2.1的Spritekit游戏中获取EXC_BAD_ACCESS

来自分类Dev

使用NativeCSS时EXC_BAD_ACCESS

来自分类Dev

使用协议组成的EXC_BAD_ACCESS

来自分类Dev

使用MPMoviePlayerViewController的EXC_BAD_ACCESS

来自分类Dev

使用AlamoFire发出HTTP请求会导致EXC_BAD_ACCESS

来自分类Dev

为什么使用std :: transform会导致exc_bad_access

来自分类Dev

Swift字符串操作导致EXC_BAD_ACCESS

来自分类Dev

va_args()导致EXC_BAD_ACCESS

来自分类Dev

memcpy()在iOS中导致EXC_BAD_ACCESS

来自分类Dev

在NSUserDefaults中存储字典导致EXC_BAD_ACCESS

来自分类Dev

键盘通知导致EXC_BAD_ACCESS崩溃