线程1:EXC_BAD_ACCESS(代码=1,地址=0X48)

Boh*_*huk 2 ios swift4

我是斯威夫特的新手。我正在尝试运行此代码但出现错误:

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x48)

错误出现在这里:

self.player.play()

任何人都可以帮助解决这个问题吗?

导入 UIKit
导入 AVFoundation

类视图控制器:UIViewController {

var player = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() do { if let audioPath = Bundle.main.path(forResource: "music", ofType: "mp3") { try player = AVAudioPlayer(contentsOf: URL(fileURLWithPath: audioPath)) } } catch { print("ERROR") } self.player.play() }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ace 5

你用你的代码做的是:

  1. 创建一个没有任何数据的 AVAudioPlayer 实例
  2. 尝试使用music.mp3文件中的一些数据创建一个新实例
  3. 播放它

如果audioPath不正确,则播放器未正确创建:应用程序将使用没有有效数据的播放器,从而导致播放过程中崩溃。

您的代码可以编写为 player optional,这有助于防止崩溃:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player: AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        player = initializePlayer()
        player?.play()
    }

    private func initializePlayer() -> AVAudioPlayer? {
        guard let path = Bundle.main.path(forResource: "music", ofType: "mp3") else {
            return nil
        }

        return try? AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
    }
}
Run Code Online (Sandbox Code Playgroud)

对代码执行的一些更改:

  • player现在是可选的:不需要初始化两次。另外,如果初始化顺利,您可以毫无问题地使用它,否则您的应用程序不会崩溃。
  • play方法现在位于可选链中
  • 我已经在一个单独的私有方法中移动了播放器的初始化,以保持代码可读。随意更改它,这只是一个建议。