【问题标题】:Receiving 'EXC_BAD_ACCESS Code=2' in an Obj-C to Swift Conversion在 Obj-C 到 Swift 的转换中接收“EXC_BAD_ACCESS Code=2”
【发布时间】:2015-07-01 17:32:01
【问题描述】:

我在线上的 TimeView 控制器中收到错误“EXC_BAD_ACCESS (code=2,address=0x16fcbbfec)”

var soundEffects = SoundEffects()

我不知道为什么会这样......

我已为愿意查看并帮助我的任何人提供了指向我的源代码的链接。谢谢!

https://github.com/JohnnyH1012/HRC

相关代码

import UIKit
import AVFoundation

class SoundEffects: NSObject, AVAudioPlayerDelegate {
    var soundEffects = SoundEffects()
    var player = AVAudioPlayer()
    var storage = SettingsStorage()
    var enabled:Bool = false
    var newValue:Bool = true
    var tabata: Tabata!
    var theme: Theme!

func registerSoundEffects() {

    soundEffects = SoundEffects.new()

    NSNotificationCenter.defaultCenter().addObserver(soundEffects, selector: "stateChanged:", name: StateChanged, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(soundEffects, selector: "prepareSignal:", name: PrepareSignal, object: nil)

    var error:NSError?

    var url: NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("beep_01", ofType: "mp3")!)!

    player = AVAudioPlayer(contentsOfURL: url, error: &error)
    player.numberOfLoops = 0
    player.prepareToPlay()
    enabled = storage.loadSoundEnabled()

}

func isEnabled() {

    return enabled = true

}

func setEnabled() {
    enabled = newValue
    storage.saveSoundEnabled(newValue)

}

func stateChanged(notification: NSNotification) {
    if enabled {

        var tabata: Tabata! = notification.object! as! Tabata
        switch tabata.getState() {
        case .EXERCISE: fallthrough
        case .RELAXATION:
            player.play()
            break

        default:
            break

        }
    }
}

func prepareSignal(notification:NSNotification) {

    if enabled {
        player.play()
    }

}

}

【问题讨论】:

    标签: objective-c swift ios8 xcode6


    【解决方案1】:

    你有一个无限递归循环。当你初始化一个SoundEffects时,它会初始化它的soundEffects变量,它初始化一个SoundEffects对象,它初始化soundEffects var,它...

    你看到问题了吗?

    【讨论】:

    • 是的,但是如何解决这个问题?
    • 好吧,我需要你解释一下你的意图,让一个类在变量中包含对自身实例的引用。
    • 我不完全确定,我从 Github 上检索了计时器项目,并试图理解作者的工作。
    【解决方案2】:

    可能与setEnabled setter 存在冲突。在 Swift 中,有一些属性观察器在设置变量后被调用。

    删除isEnabled()setEnabled()方法使用变量enabled这种方式也可以作为getter

    var enabled: Bool = false {
        didSet {
           storage.saveSoundEnabled(newValue)
        }
    }
    

    【讨论】:

    • 实施您的建议会导致“有趣的 stateChanged(notification: NSNotification)”给出“预期的 'get'、'set'、'willSet' 或 'didSet' 关键字来启动访问器定义" 错误
    • 最后少了一个大括号,我编辑了帖子
    • 好的,感谢您修复该问题,但应用程序仍然崩溃并出现同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多